SQL中如何按NAME分组获取对应THING的最大SUM(NUM)值
解决方案
你已经通过GROUP BY得到了每个NAME+THING组合的NUM总和,接下来只需从这些分组结果中,为每个NAME筛选出总和最大的那条记录。使用窗口函数是最简洁高效的实现方式:
方法1:用ROW_NUMBER()取唯一最大值记录
WITH grouped_data AS ( SELECT NAME, THING, SUM(NUM) AS total_num FROM this_table GROUP BY NAME, THING ) SELECT NAME, THING, total_num FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY total_num DESC) AS rn FROM grouped_data ) t WHERE rn = 1;
方法2:用RANK()保留并列最大值
如果某个NAME下存在多个THING的总和相等且同为最大值,RANK()会保留所有并列记录(ROW_NUMBER()会随机选一条):
WITH grouped_data AS ( SELECT NAME, THING, SUM(NUM) AS total_num FROM this_table GROUP BY NAME, THING ) SELECT NAME, THING, total_num FROM ( SELECT *, RANK() OVER (PARTITION BY NAME ORDER BY total_num DESC) AS rk FROM grouped_data ) t WHERE rk = 1;
逻辑说明
- 先通过CTE(
grouped_data)生成你已得到的分组总和结果; - 外层查询用窗口函数按
NAME分组(PARTITION BY NAME),再按总和降序排序,给每条记录标记序号; - 筛选序号为1的记录,即为每个
NAME下总和最大的条目。
执行后会得到你期望的结果:
abc,thing1,10 jkl,thing1,100 xyz,thing2,200
内容的提问来源于stack exchange,提问作者Ike
相关产品推荐
相关产品推荐

