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

按id分组计算cc求和值,筛选每组最大求和值及对应e_sour的SQL问题

解决SQL重复ID问题:获取每个ID的最大CC求和记录

需求回顾

  • 对每个唯一id,先按e_sour维度计算cc的总和
  • 最终输出每个id对应的最大求和值及关联的e_sour
  • 当前SQL无法保证id唯一,存在重复行问题

原始数据

ide_sourcc
1win400
1win400
1elec400
2win400
2win400

期望输出

ide_sourcc
1win800
2win800

原SQL问题分析

你的现有SQL存在两个核心问题导致重复ID:

  1. Input2仍按id, e_sour分组,保留了每个ID下不同e_sour的求和结果
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:40:27