按id分组计算cc求和值,筛选每组最大求和值及对应e_sour的SQL问题
解决SQL重复ID问题:获取每个ID的最大CC求和记录
需求回顾
- 对每个唯一
id,先按e_sour维度计算cc的总和 - 最终输出每个
id对应的最大求和值及关联的e_sour - 当前SQL无法保证
id唯一,存在重复行问题
原始数据
| id | e_sour | cc |
|---|---|---|
| 1 | win | 400 |
| 1 | win | 400 |
| 1 | elec | 400 |
| 2 | win | 400 |
| 2 | win | 400 |
期望输出
| id | e_sour | cc |
|---|---|---|
| 1 | win | 800 |
| 2 | win | 800 |
原SQL问题分析
你的现有SQL存在两个核心问题导致重复ID:
Input2仍按id, e_sour分组,保留了每个ID下不同e_sour的求和结果Input3取每个ID的最大求和值后,关联Input2时仅用id匹配,会把该ID下所有e_sour的记录都关联回来,最终输出多条同一ID的记录
修正后的SQL方案
使用窗口函数ROW_NUMBER()可以高效解决这个问题,直接筛选每个ID下的最大求和记录:
WITH Src AS ( -- 第一步:按id+e_sour聚合求和,提前过滤rm='Latest'(比Having更高效) SELECT id, e_sour, SUM(cc) AS total_cc FROM Prod WHERE rm = 'Latest' GROUP BY id, e_sour ), Ranked AS ( -- 第二步:给每个ID内的求和值按降序排序,最大的标记为1 SELECT id, e_sour, total_cc, ROW_NUMBER() OVER(PARTITION BY id ORDER BY total_cc DESC) AS rn FROM Src ) -- 第三步:只保留每个ID的第一条记录(即最大求和值的记录) SELECT id, e_sour, total_cc AS cc FROM Ranked WHERE rn = 1 ORDER BY id;
补充说明
- 如果同一个ID下存在多个
e_sour的求和值相同且均为最大值,想要保留所有并列记录,可以把ROW_NUMBER()换成RANK() - 原SQL中用
Having rm='Latest'的写法可以优化为WHERE rm='Latest',因为WHERE是聚合前过滤数据,比聚合后用Having过滤更高效
内容的提问来源于stack exchange,提问作者Glss1
相关产品推荐
相关产品推荐

