基于条件聚合值:如何用SELECT语句按规则汇总Total与Value
解决方案
要实现将Table A中数据按“累计到Total和Value均非零的行”分组求和,可通过窗口函数标记分组再聚合的方式实现,以下是具体SQL代码(适用于支持窗口函数的数据库如MySQL 8+、PostgreSQL、SQL Server等):
WITH grouped_data AS ( SELECT *, -- 标记分组:每遇到Total和Value均非零的行,分组ID递增 SUM(CASE WHEN Total <> 0 AND Value <> 0 THEN 1 ELSE 0 END) OVER (ORDER BY Sno. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS group_id FROM TableA ) -- 按分组ID聚合求和 SELECT SUM(Total) AS Total, SUM(Value) AS Value FROM grouped_data GROUP BY group_id ORDER BY group_id;
逻辑说明
- 分组标记:通过
SUM() OVER()窗口函数,对每行判断是否为“Total和Value均非零”的终止行——若是则加1,否则继承之前的分组ID,这样所有从起始行到终止行的记录会被归为同一组。 - 分组求和:按生成的
group_id分组,对Total和Value分别求和,得到Table B的结果。
验证结果
- 第1-3行(group_id=1):Total总和
0+225+210=435,Value总和1+0+2=3 - 第4-7行(group_id=2):Total总和
0+0+150+150=300,Value总和0+0.5+0+0.5=1.0
完全匹配Table B的预期输出。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

