Oracle SQL - 基于分组和条件运行求和
Posted
技术标签:
【中文标题】Oracle SQL - 基于分组和条件运行求和【英文标题】:Oracle SQL - Running Sum based on group by and condition 【发布时间】:2020-03-31 16:38:41 【问题描述】:我的桌子看起来像
ID SEQ LABEL COUNT
1 1 0 3
1 2 0 2
1 3 0 6
1 4 1 2
1 5 0 3
1 6 0 5
2 1 0 2
2 2 1 1
2 3 0 3
我想创建一个名为 running_count 的列。它计算列计数的累积总和,直到Label为1,然后重置并再次开始累积总和。
预期输出:
ID SEQ LABEL1 COUNT1 RUNNING_COUNT
1 1 0 3 3
1 2 0 2 5
1 3 0 6 14
1 4 1 2 16
1 5 0 3 3
1 6 0 5 8
2 1 0 2 2
2 2 1 1 3
2 3 0 3 3
我尝试了以下查询
SELECT A.*, SUM(COUNT1) over (partition by ID,LABEL1 order by SEQ) as RUNNING_COUNT FROM TABLE_1 A
这里的问题是,对于 Label = 1,累积总和在前一行(Seq)中停止。我需要根据 Seq 为每个 ID 获取运行总和直到 Label = 1。
我得到的错误输出
ID SEQ LABEL1 COUNT1 RUNNING_COUNT
1 1 0 3 3
1 2 0 2 5
1 3 0 6 14
1 4 1 2 2
1 5 0 3 3
1 6 0 5 8
2 1 0 2 2
2 2 1 1 1
2 3 0 3 3
【问题讨论】:
【参考方案1】:您可以创建第一个窗口sum()
来定义组,然后将其用作外部查询的分区:
select
t.*,
sum(count1) over(partition by id, grp order by seq) running_count
from (
select
t.*,
sum(label) over(partition by id order by seq desc) grp
from mytable t
) t
Demo on DB Fiddle:
身份证 |序列 |标签 |计数1 |玻璃钢 | RUNNING_COUNT 个 -: | --: | ----: | -----: | --: | ------------: 1 | 1 | 0 | 3 | 1 | 3 1 | 2 | 0 | 2 | 1 | 5 1 | 3 | 0 | 6 | 1 | 11 1 | 4 | 1 | 2 | 1 | 13 1 | 5 | 0 | 3 | 0 | 3 1 | 6 | 0 | 5 | 0 | 8 2 | 1 | 0 | 2 | 1 | 2 2 | 2 | 1 | 1 | 1 | 3 2 | 3 | 0 | 3 | 0 | 3【讨论】:
以上是关于Oracle SQL - 基于分组和条件运行求和的主要内容,如果未能解决你的问题,请参考以下文章