【问题标题】:Conditional running total条件运行总计
【发布时间】:2019-03-20 07:13:42
【问题描述】:

我在 Redshift 中有一件有趣的事情要做。说,我有一张这样的桌子:

index,total,delta
0,3,null
1,5,2
2,10,5
3,11,1
4,null,4
5,null,6
6,null,2

其中delta 是每个total 与前一行的total 之间的差异。在这里,我的deltas 与我的totals 来自不同的来源,因此可以在没有收到更新的totals 的情况下接收deltas。

如何根据deltas 估算totals?像这样:

index,total,delta
0,3,null
1,5,2
2,10,5
3,11,1
4,15,4
5,21,6
6,23,2

我在 NVL(total, LAST_VALUE(total IGNORE NULLS) OVER (ORDER BY index ROWS UNBOUNDED PRECEDING) + SUM(delta) OVER (ORDER BY index ROWS UNBOUNDED PRECEDING) 附近的某个地方乱七八糟,但这并不完全可行 - 我只想 SUMdeltas 没有对应的 total

【问题讨论】:

    标签: sql amazon-redshift window-functions cumulative-sum


    【解决方案1】:

    你可以使用:

    -- creating subgroups
    WITH cte AS (
      SELECT *, SUM(total IS NOT NULL::int) OVER(ORDER BY index) s
      FROM tab
    )
    SELECT index, 
        CASE WHEN total IS NULL 
             THEN SUM(COALESCE(total,0) + delta) OVER(PARTITION BY s ORDER BY index)
                 -FIRST_VALUE(delta) OVER(PARTITION BY s ORDER BY index)
                 -- running total starting from first not null total + delta
                 -- decreased by first delta
             ELSE total
        END AS total
       ,delta
    FROM cte
    ORDER BY index;
    

    db<>fiddle demo

    输出:

    ┌────────┬────────┬───────┐
    │ index  │ total  │ delta │
    ├────────┼────────┼───────┤
    │     0  │     3  │       │
    │     1  │     5  │     2 │
    │     2  │    10  │     5 │
    │     3  │    11  │     1 │
    │     4  │    15  │     4 │
    │     5  │    21  │     6 │
    │     6  │    23  │     2 │
    └────────┴────────┴───────┘
    

    编辑

    其实不需要FIRST_VALUE

    WITH cte AS (
      SELECT *, SUM(total IS NOT NULL::int) OVER(ORDER BY index) s
      FROM tab
    )
    SELECT index, 
       CASE WHEN total IS NULL 
        THEN SUM(COALESCE(total,0) 
           + CASE WHEN total IS NOT NULL THEN 0 ELSE delta END) 
            OVER(PARTITION BY s ORDER BY index)
        ELSE total
       END AS total
      ,delta
    FROM cte
    ORDER BY index;
    

    db<>fiddle demo2

    【讨论】:

    • 太棒了!这是限制 SUM 窗口函数的一种非常聪明的方法。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2020-07-09
    • 2021-11-23
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    相关资源
    最近更新 更多