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

按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:54:34