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

SQL分组需求:仅当百分比总和<100时分组,否则保留原记录

按条件分组的SQL实现方案

需求说明

需执行GROUP BY操作,仅当同一ID下的记录百分比总和小于100时进行分组;若百分比总和为100或更高,则保持原记录不变。

当前尝试的SQL

SELECT ID,SUM(Percentage),SUM(Value)
From table
GROUP BY ID

上述语句会对所有ID强制分组,无法满足“仅百分比总和<100时分组”的条件。

解决方案

可以通过子查询先计算每个ID的百分比总和,再结合UNION ALL或窗口函数实现条件分组:

方法1:用UNION ALL拆分两种场景

-- 场景1:百分比总和<100,执行分组
SELECT ID, SUM(Percentage) AS TotalPercentage, SUM(Value) AS TotalValue
FROM your_table
GROUP BY ID
HAVING SUM(Percentage) < 100

UNION ALL

-- 场景2:百分比总和>=100,保留原记录
SELECT ID, Percentage, Value
FROM your_table
WHERE ID IN (
    SELECT ID
    FROM your_table
    GROUP BY ID
    HAVING SUM(Percentage) >= 100
)
ORDER BY ID;

方法2:用窗口函数标记分组状态

WITH id_summary AS (
    SELECT 
        *,
        SUM(Percentage) OVER(PARTITION BY ID) AS id_total_percent
    FROM your_table
)
SELECT 
    ID,
    CASE WHEN id_total_percent < 100 THEN SUM(Percentage) OVER(PARTITION BY ID) ELSE Percentage END AS Percentage,
    CASE WHEN id_total_percent < 100 THEN SUM(Value) OVER(PARTITION BY ID) ELSE Value END AS Value
FROM id_summary
-- 去重分组后的重复行
WHERE NOT (id_total_percent < 100 AND Percentage <> SUM(Percentage) OVER(PARTITION BY ID))
ORDER BY ID;

补充说明

  • 方法1逻辑直观,适合数据量不大的场景,通过UNION ALL合并两种结果集;
  • 方法2使用窗口函数仅扫描一次表,性能更优,适合大数据量场景;
  • 替换语句中的your_table为实际表名即可使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:57:52