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
相关产品推荐
相关产品推荐

