仅当下一行不同时如何更改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
)
;
我有这个
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
)
;