为序列值组生成增量标识符
Generating increment identifiers for group of sequence values
在SQL中:
我有一个 table 类似于这个
ID
Name
Room
1
John
A
2
John
A
3
John
B
4
John
A
5
John
C
6
John
C
7
Nick
C
8
Nick
B
9
Nick
B
10
Nick
A
11
Nick
A
12
Nick
B
我需要创建一个自动递增的 ID
,它遵循两列 Name
和 Room
的顺序。如果顺序改变,数量会增加。
结果应该是这样的
ID
Name
Room
New ID
1
John
A
1
2
John
A
1
3
John
B
2
4
John
A
3
5
John
C
4
6
John
C
4
7
Nick
C
5
8
Nick
B
6
9
Nick
B
6
10
Nick
A
7
11
Nick
A
7
12
Nick
B
8
你能帮忙吗?
使用 lag()
查看值的变化位置。然后使用累计和:
select t.*,
sum(case when prev_id = prev_id_2 then 0 else 1 end) over (order by id) as newid
from (select t.*,
lag(id) over (order by id) as prev_id,
lag(id) over (partition by name, room order by id) as prev_id_2
from t
) t;
这个工作的方式是根据name
和room
查看以前的id和以前的id。如果这些相同,则没有变化。
在SQL中: 我有一个 table 类似于这个
ID | Name | Room |
---|---|---|
1 | John | A |
2 | John | A |
3 | John | B |
4 | John | A |
5 | John | C |
6 | John | C |
7 | Nick | C |
8 | Nick | B |
9 | Nick | B |
10 | Nick | A |
11 | Nick | A |
12 | Nick | B |
我需要创建一个自动递增的 ID
,它遵循两列 Name
和 Room
的顺序。如果顺序改变,数量会增加。
结果应该是这样的
ID | Name | Room | New ID |
---|---|---|---|
1 | John | A | 1 |
2 | John | A | 1 |
3 | John | B | 2 |
4 | John | A | 3 |
5 | John | C | 4 |
6 | John | C | 4 |
7 | Nick | C | 5 |
8 | Nick | B | 6 |
9 | Nick | B | 6 |
10 | Nick | A | 7 |
11 | Nick | A | 7 |
12 | Nick | B | 8 |
你能帮忙吗?
使用 lag()
查看值的变化位置。然后使用累计和:
select t.*,
sum(case when prev_id = prev_id_2 then 0 else 1 end) over (order by id) as newid
from (select t.*,
lag(id) over (order by id) as prev_id,
lag(id) over (partition by name, room order by id) as prev_id_2
from t
) t;
这个工作的方式是根据name
和room
查看以前的id和以前的id。如果这些相同,则没有变化。