如何对多行的列值求和?

Com*_*der 3 sql group-by date gaps-and-islands clickhouse

我有这个表,我想为几行添加 'change' 列的值(或者,更准确地说,从 'ne' 值为零的行到下一行,其中包括 'ne' 的零(不是第二个本身))。任何答案将不胜感激。

??rn?????????date???ne?????????change??
?  0 ? 2008-12-07 ?  0 ? -10330848398 ?
?  1 ? 2009-04-14 ?  1 ?       -61290 ?
?  2 ? 2009-04-26 ?  1 ?   9605743360 ?
?  3 ? 2013-07-06 ?  0 ? -32028871920 ?
?  4 ? 2014-01-12 ?  1 ? -42296164902 ?
?  5 ? 2015-06-08 ?  1 ?  59100383646 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我们期望的结果是这样的。

row    start        end         sum(change) 
--------------------------------------------------
0 | 2008-12-07 | 2009-04-26 | -725,166,328
--------------------------------------------------
1 | 2013-07-06 | 2015-06-08 | -15,224,653,176
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 6

这是一个缺口和孤岛问题。规范的解决方案确实使用了窗口函数,就相关问题而言,Clickhouse 不支持。

这是一种使用子查询来模拟条件窗口总和的方法:

select
    min(date) start_date,
    max(date) end_date,
    sum(change) sum_change
from (
    select 
        t.*,
        (select count(*) from mytable t1 where t1.date <= t.date and t1.ne = 0) grp
    from mytable t
) t
group by grp
Run Code Online (Sandbox Code Playgroud)

子查询计算有多少行 ne = 0从表的第一行到当前。这定义了记录组。然后剩下要做的就是聚合。

如果您可以使用窗口函数,您可以将其表述为:

select
    min(date) start_date,
    max(date) end_date,
    sum(change) sum_change
from (
    select 
        t.*,
        sum(case when ne = 0 then 1 else 0 end) over(order by date) grp
    from mytable t
) t
group by grp
Run Code Online (Sandbox Code Playgroud)