Spark SQL多列分组带条件:保留同最大Count行问题求助
解决SQL分组保留所有最大值行的问题
你的问题核心是原代码的外层GROUP BY name,code会直接合并同一组的所有行,哪怕有多行Count是最大值,也只会输出一行;同时MAX(date)的使用还会错误替换掉原本对应最大值的日期。下面给你两种靠谱的解决方法:
方法一:使用窗口函数(推荐)
利用RANK()窗口函数给每个(Name,Code)组内的行按Count降序排名,排名为1的就是Count最大的行,并列最大值的行排名都会是1,因此能全部保留:
WITH aggregated_data AS ( -- 先按日期、Name、Code聚合得到每日的Cases_Number,和你原逻辑一致 SELECT lhd_2010_name AS name, lhd_2010_code AS code, notification_date AS date, FLOOR(SUM(num)) AS Cases_Number FROM cases GROUP BY notification_date, lhd_2010_name, lhd_2010_code ), ranked_data AS ( -- 给每个(Name,Code)组内的行按Cases_Number降序排名 SELECT *, RANK() OVER (PARTITION BY name, code ORDER BY Cases_Number DESC) AS rank_num FROM aggregated_data ) -- 筛选出排名为1的行,也就是组内Count最大的所有行 SELECT name, code, date, Cases_Number AS Max_Num FROM ranked_data WHERE rank_num = 1 ORDER BY Max_Num DESC;
方法二:子查询求组内最大值再关联
先算出每个(Name,Code)组的最大Count,再和聚合后的原始数据关联,匹配出所有Count等于组内最大值的行:
WITH aggregated_data AS ( SELECT lhd_2010_name AS name, lhd_2010_code AS code, notification_date AS date, FLOOR(SUM(num)) AS Cases_Number FROM cases GROUP BY notification_date, lhd_2010_name, lhd_2010_code ), max_group_counts AS ( -- 计算每个(Name,Code)组的最大Cases_Number SELECT name, code, MAX(Cases_Number) AS max_num FROM aggregated_data GROUP BY name, code ) -- 关联匹配出所有Count等于组内最大值的行 SELECT ad.name, ad.code, ad.date, ad.Cases_Number AS Max_Num FROM aggregated_data ad JOIN max_group_counts mc ON ad.name = mc.name AND ad.code = mc.code AND ad.Cases_Number = mc.max_num ORDER BY ad.Cases_Number DESC;
两种方法都能实现你的需求:保留A的最大Count行、B的行,以及C的两行并列最大值行。
内容的提问来源于stack exchange,提问作者Alphonse
相关产品推荐
相关产品推荐

