You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用分区函数计算分组下id_2唯一值并生成计算列

解决方法:用窗口函数实现分组唯一计数与计算

嗨,你找对路子啦——窗口函数(Partition Function)正是搞定这个需求的完美工具!我帮你写好具体的SQL代码,还会解释每部分的作用,确保你能直接套用。

核心思路

我们需要完成两个核心计算:

  1. 按id_1和cost分组,统计每组内唯一id_2的数量(对应你要的distinct列)
  2. 用cost除以这个唯一数量,得到calc列,保留两位小数

通用SQL实现(支持MySQL 8.0+、PostgreSQL、SQL Server等)

SELECT 
    id_1,
    id_2,
    cost,
    -- 分组内唯一id_2的数量
    COUNT(DISTINCT id_2) OVER (PARTITION BY id_1, cost) AS distinct_count,
    -- 计算cost除以唯一数量,保留两位小数
    ROUND(cost / COUNT(DISTINCT id_2) OVER (PARTITION BY id_1, cost), 2) AS calc
FROM your_table_name;

代码解释

  • COUNT(DISTINCT id_2) OVER (PARTITION BY id_1, cost):这个窗口函数会把数据按id_1和cost分成不同的组,然后在每个组内统计不重复的id_2数量,并且把这个数值填充到组内的每一行里。
  • ROUND(..., 2):用来把计算结果格式化保留两位小数,和你给出的示例格式完全匹配。

兼容旧版MySQL(5.x)的方案

如果你的MySQL版本不支持窗口函数里的COUNT(DISTINCT),可以用子查询先计算分组的唯一数量,再关联回原表:

SELECT 
    t.id_1,
    t.id_2,
    t.cost,
    g.distinct_count,
    ROUND(t.cost / g.distinct_count, 2) AS calc
FROM your_table_name t
JOIN (
    -- 先计算每个分组的唯一id_2数量
    SELECT id_1, cost, COUNT(DISTINCT id_2) AS distinct_count
    FROM your_table_name
    GROUP BY id_1, cost
) g ON t.id_1 = g.id_1 AND t.cost = g.cost;

注意事项

distinct是SQL的关键字,直接用它当列名可能会触发语法错误。建议把列名改成distinct_count,如果一定要用distinct,可以根据你的数据库方言加转义符:

  • MySQL:用反引号包裹 `distinct`
  • PostgreSQL/SQL Server:用双引号包裹 "distinct"

这样运行出来的结果就会和你给出的示例完全一致啦!

内容的提问来源于stack exchange,提问作者user9302275

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:57:03