按ID分组并以Date排序后,分两组汇总Amount的SQL实现
解决方案
假设你的数据存储在名为records的表中,包含字段id、Date、Amount、Condition,可以通过窗口函数+条件分组实现需求,步骤如下:
1. 标记每条记录的分组归属
先通过窗口函数计算每个id下首次出现非零Condition的日期,再根据该日期判断每条记录属于哪一组:
WITH marked_records AS ( SELECT id, Amount, -- 标记分组类型 CASE -- 该id下无任何非零Condition的情况 WHEN MIN(CASE WHEN Condition <> 0 THEN Date END) OVER (PARTITION BY id) IS NULL THEN '无首次非零Condition' -- 首次非零Condition出现前的记录 WHEN Date < MIN(CASE WHEN Condition <> 0 THEN Date END) OVER (PARTITION BY id) THEN '首次非零Condition之前' -- 首次非零Condition出现后的所有记录(包括首次非零那条,后续0不影响) ELSE '首次非零Condition之后' END AS group_type FROM records ORDER BY id, Date )
2. 按分组汇总Amount
基于标记好的分组,对每个id的不同组进行金额求和:
SELECT id, group_type, SUM(Amount) AS total_amount FROM marked_records GROUP BY id, group_type ORDER BY id, group_type;
关键逻辑说明
MIN(CASE WHEN Condition <> 0 THEN Date END) OVER (PARTITION BY id):在每个id分组内,找到最早出现非零Condition的日期,作为分组的分界点。- 分界点之后的所有记录(即使后续
Condition变回0)都会被归到“首次非零之后”组,符合需求描述。 - 针对无任何非零
Condition的id,单独划分一组避免逻辑遗漏。
内容的提问来源于stack exchange,提问作者Mr.Cast29
相关产品推荐
相关产品推荐

