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)
这是一个缺口和孤岛问题。规范的解决方案确实使用了窗口函数,就相关问题而言,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)