我希望实现运行值,但条件会在某些特定列值上重置,如
这是我的选择陈述
with tbl(emp,salary,ord) as
(
select 'A',1000,1 from dual union all
select 'B',1000,2 from dual union all
select 'K',1000,3 from dual union all
select 'A',1000,4 from dual union all
select 'B',1000,5 from dual union all
select 'D',1000,6 from dual union all
select 'B',1000,7 from dual
)
select * from tbl
如果列值为B,我想重置emp B上的计数,然后count重置为0并再次开始递增1
emp salary ord running_count
A 1000 1 0
B 1000 2 1
K 1000 3 0
A 1000 4 1
B 1000 5 2
D 1000 6 0
B 1000 7 1
此处订单栏为 ord
我想通过select语句不使用游标来实现整个事情。
先谢谢。
答案 0 :(得分:2)
您想要定义计数发生的组。在一个组中,解决方案是row_number()
。
您可以通过执行B
值的累积总和来定义组。由于B
结束该组,您希望计算每条记录后B
的数量。
这导致:
select t.*,
row_number() over (partition by grp order by ord) - 1 as running_count
from (select t.*,
sum(case when emp = 'B' then 1 else 0 end) over (order by ord desc) as grp
from tbl t
) t;