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

SQL Server分组查询:获取分组内出现频次最高字符串并计算列总和的实现方案

解决方案:SQL Server分组聚合+获取字段众数

针对你需要在SQL Server中实现的分组查询需求,我整理了一个可以直接运行的解决方案,完美匹配你的示例数据和预期结果:

完整查询语句

WITH RankedData AS (
    SELECT 
        colA,
        colB,
        colC,
        -- 计算每个colA分组内colC的出现频次
        COUNT(*) OVER (PARTITION BY colA, colC) AS occurrence_count,
        -- 按频次降序给每个colA分组内的记录排名,频次最高的排第1
        ROW_NUMBER() OVER (PARTITION BY colA ORDER BY COUNT(*) OVER (PARTITION BY colA, colC) DESC) AS rank_num
    FROM table1
)
SELECT 
    colA,
    SUM(colB) AS total,
    -- 提取每个分组中排名第1的colC作为lable
    MAX(CASE WHEN rank_num = 1 THEN colC END) AS lable
FROM RankedData
GROUP BY colA;

语句解释

  1. CTE RankedData:

    • 首先用窗口函数COUNT(*) OVER (PARTITION BY colA, colC)计算每个colA分组下,不同colC值的出现次数;
    • 然后用ROW_NUMBER()窗口函数,在每个colA分组内按照occurrence_count降序排序,这样频次最高的colC对应的rank_num会是1。
  2. 外层聚合查询:

    • 按colA分组后,用SUM(colB)计算每组的总和total;
    • 通过MAX(CASE WHEN rank_num = 1 THEN colC END)提取出每个分组中频次最高的colC值作为lable(因为每个分组中只有一条rank_num=1的记录,用MAX或MIN都可以)。

结果验证

用你提供的示例数据运行该语句,会得到完全符合预期的结果:

colAtotallable
A100aaa
B60bbb

注意事项

如果某个colA分组内有多个colC值出现频次相同且都是最高,ROW_NUMBER()会随机返回其中一个。如果需要返回所有并列最高的colC值,可以将ROW_NUMBER()替换为DENSE_RANK(),并调整外层查询的逻辑(比如用STRING_AGG拼接多个结果)。

内容的提问来源于stack exchange,提问作者Fran Aguero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 15:27:38