SQL分区求和问题求助:按分组计算符合指定条件的Value总和
解决方案
可以通过子查询获取每个Group_1的第一条'E'日期,再关联原表筛选符合条件的记录求和,具体SQL如下:
SELECT t.Group_1, 'D' AS Group_2, SUM(t.Value) AS Sum FROM your_table t LEFT JOIN ( -- 获取每个Group_1中最早的E记录日期 SELECT Group_1, MIN(Date) AS first_e_date FROM your_table WHERE Group_2 = 'E' GROUP BY Group_1 ) e ON t.Group_1 = e.Group_1 WHERE t.Group_2 = 'D' -- 筛选条件:要么没有E记录,要么D的日期早于第一条E的日期 AND (e.first_e_date IS NULL OR t.Date < e.first_e_date) GROUP BY t.Group_1 ORDER BY t.Group_1;
逻辑说明
- 子查询
e:针对每个Group_1,找出Group_2='E'的最早日期,没有'E'的分组不会出现在这个子查询中。 - 左连接:将原表与子查询左连接,保证没有'E'的分组(如示例中的Group_1=C)仍能被保留,此时
first_e_date为NULL。 - 筛选求和:只保留
Group_2='D'的记录,并且满足「无E记录」或「日期早于第一条E的日期」的条件,最后按Group_1分组求和。
注意事项
如果你的Date字段是字符串类型,需要先转换为日期类型再进行比较,避免字符串排序导致的错误。例如:
- MySQL:
STR_TO_DATE(t.Date, '%m/%d/%Y') < STR_TO_DATE(e.first_e_date, '%m/%d/%Y') - PostgreSQL:
TO_DATE(t.Date, 'MM/DD/YYYY') < TO_DATE(e.first_e_date, 'MM/DD/YYYY') - SQL Server:
CAST(t.Date AS DATE) < CAST(e.first_e_date AS DATE)
内容的提问来源于stack exchange,提问作者Artursh
相关产品推荐
相关产品推荐

