仅当下一行不同时如何更改rownum

How to change rownum only if the next row is distinct

我有这个

RowNum Value
1 X
2 X
3 Y
4 Z
5 Z
6 Z
7 V

我想要这样的东西

RowNum Value
1 X
1 X
2 Y
3 Z
3 Z
3 Z
4 V

我如何在 Oracle 中执行此操作? 谢谢

这是一种方法 - 使用 match_recognize 子句,从 Oracle 12.1 开始可用。注意rownum是保留关键字,不能是列名;我在输入中将其更改为 rnum,在输出中将其更改为 rn,根据需要进行调整。

with 子句不是查询的一部分 - 它只是为了包含您的示例数据。在对您的实际数据使用查询之前将其删除。

with
  inputs (rnum, value) as (
    select 1, 'X' from dual union all
    select 2, 'X' from dual union all
    select 3, 'Y' from dual union all
    select 4, 'Z' from dual union all
    select 5, 'Z' from dual union all
    select 6, 'Z' from dual union all
    select 7, 'V' from dual
  )
select rn, value
from   inputs
match_recognize (
  order by rnum
  measures match_number() as rn
  all rows per match
  pattern  ( a+ )
  define   a as value = first(value)
);

RN VALUE
-- -----
 1 X    
 1 X    
 2 Y    
 3 Z    
 3 Z    
 3 Z    
 4 V  

在Oracle 11.2及更早版本中,可以使用start-of-group方法(在子查询中创建并在外部查询中计数的标志):

select count(flag) over (order by rnum) as rn, value
from   (
         select rnum, value, 
                case lag(value) over (order by rnum) 
                     when value then null else 1 end as flag
         from   inputs
       )
;