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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:15:51