SQL 多个条件的累计和
SQL cumulative sum with mutilple conditions
我的输入 table 是这样的:
date ID Flag
01.01 A 0
01.02 A 0
01.03 A 1
01.04 A 1
01.05 A 1
01.06 A 0
01.07 A 1
01.08 A 1
01.09 A 0
01.01 B 1
01.02 B 0
01.03 B 1
01.04 B 1
01.05 B 1
01.06 B 1
01.07 B 1
01.08 B 0
01.09 B 0
我想计算每个flag的累加和,但是如果flag再次等于0需要刷新计算
所以,输出 table 应该是:
date ID Flag CUMSUM
01.01 A 0 0
01.02 A 0 0
01.03 A 1 1
01.04 A 1 2
01.05 A 1 3
01.06 A 0 0
01.07 A 1 1
01.08 A 1 2
01.09 A 0 0
01.01 B 1 1
01.02 B 0 0
01.03 B 1 1
01.04 B 1 2
01.05 B 1 3
01.06 B 1 4
01.07 B 1 5
01.08 B 0 0
01.09 B 0 0
那么,有什么解决这个问题的建议吗?
我试过这个:
sum(FLAG) over (partition by ID order by date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
但我不知道如何“刷新”累积计算,知道吗?
提前致谢!
您需要分配一个分组。分组是每行前0
的个数。然后使用它进行分区:
select t.*,
(case when flag = 1
then sum(flag) over (partition by id, grp order by date)
else 0
end) as cumulative_sum
from (select t.*,
sum(case when flag = 0 then 1 else 0 end) over (partition by id order by date) as grp
from t
) t;
注意:假设日期是唯一的(如示例数据中所示),则不需要 window 框架规范 (rows between . . .
)。所以,我就把它留下了。
另外,可以将子查询中的计算简化为:
sum(1 - flag = 0) over (partition by id order by date) as grp
我的输入 table 是这样的:
date ID Flag
01.01 A 0
01.02 A 0
01.03 A 1
01.04 A 1
01.05 A 1
01.06 A 0
01.07 A 1
01.08 A 1
01.09 A 0
01.01 B 1
01.02 B 0
01.03 B 1
01.04 B 1
01.05 B 1
01.06 B 1
01.07 B 1
01.08 B 0
01.09 B 0
我想计算每个flag的累加和,但是如果flag再次等于0需要刷新计算
所以,输出 table 应该是:
date ID Flag CUMSUM
01.01 A 0 0
01.02 A 0 0
01.03 A 1 1
01.04 A 1 2
01.05 A 1 3
01.06 A 0 0
01.07 A 1 1
01.08 A 1 2
01.09 A 0 0
01.01 B 1 1
01.02 B 0 0
01.03 B 1 1
01.04 B 1 2
01.05 B 1 3
01.06 B 1 4
01.07 B 1 5
01.08 B 0 0
01.09 B 0 0
那么,有什么解决这个问题的建议吗? 我试过这个:
sum(FLAG) over (partition by ID order by date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
但我不知道如何“刷新”累积计算,知道吗?
提前致谢!
您需要分配一个分组。分组是每行前0
的个数。然后使用它进行分区:
select t.*,
(case when flag = 1
then sum(flag) over (partition by id, grp order by date)
else 0
end) as cumulative_sum
from (select t.*,
sum(case when flag = 0 then 1 else 0 end) over (partition by id order by date) as grp
from t
) t;
注意:假设日期是唯一的(如示例数据中所示),则不需要 window 框架规范 (rows between . . .
)。所以,我就把它留下了。
另外,可以将子查询中的计算简化为:
sum(1 - flag = 0) over (partition by id order by date) as grp