如何用分区函数计算分组下id_2唯一值并生成计算列
解决方法:用窗口函数实现分组唯一计数与计算
嗨,你找对路子啦——窗口函数(Partition Function)正是搞定这个需求的完美工具!我帮你写好具体的SQL代码,还会解释每部分的作用,确保你能直接套用。
核心思路
我们需要完成两个核心计算:
- 按
id_1和cost分组,统计每组内唯一id_2的数量(对应你要的distinct列) - 用
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
相关产品推荐
相关产品推荐

