运行计数重置选择查询中的某些列值

时间:2016-09-03 11:35:29

标签: sql oracle

我希望实现运行值,但条件会在某些特定列值上重置,如

这是我的选择陈述

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语句不使用游标来实现整个事情。

先谢谢。

1 个答案:

答案 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;