gpt4 book ai didi

sql - 如何对多行的列的值求和?

转载 作者:行者123 更新时间:2023-12-02 06:12:47 32 4
gpt4 key购买 nike

我有这个表,我想为几行添加 '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 │
└────┴────────────┴────┴──────────────┘

我们期望的结果是这样的。
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
--------------------------------------------------

最佳答案

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

子查询计算有多少行 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

关于sql - 如何对多行的列的值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61163259/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com