使用 In mysql 分区获取增量数
Get Incremental number using partition by In mysql
我有一些独特的场景
输入:
VAR
1 A
2 A
3 A
4 NULL
5 NULL
6 A
7 A
8 A
9 B
10 B
11 B
12 NULL
13 B
14 B
15 B
16 C
17 C
18 C
19 C
我已经按照上面的顺序输入了数据。我需要使用分区列 VAR 创建输出列作为 Rank。但如果中间有空值,Rank 应该重置其计数器。
预期输出:
VAR output
1 A 1
2 A 2
3 A 3
4 NULL
5 NULL
6 A 1
7 A 2
8 A 3
9 B 1
10 B 2
11 B 3
12 NULL
13 B 1
14 B 2
15 B 3
16 C 1
17 C 2
18 C 3
19 C 4
这看起来像是一个缺口和孤岛问题。假设您有另一列定义记录的顺序(例如,id
),这是一种使用行号之间的差异来定义相邻记录组的方法:
select
var,
case when var is not null
then row_number() over(partition by var, rn1 - rn2 order by id)
end rnk
from (
select
t.*,
row_number() over(order by id) rn1,
row_number() over(partition by var order by id) rn2
from mytable t
) t
order by id
请注意,window 功能仅在最新的 MySQL 版本(即 8.0 版)中可用。
我有一些独特的场景
输入:
VAR
1 A
2 A
3 A
4 NULL
5 NULL
6 A
7 A
8 A
9 B
10 B
11 B
12 NULL
13 B
14 B
15 B
16 C
17 C
18 C
19 C
我已经按照上面的顺序输入了数据。我需要使用分区列 VAR 创建输出列作为 Rank。但如果中间有空值,Rank 应该重置其计数器。
预期输出:
VAR output
1 A 1
2 A 2
3 A 3
4 NULL
5 NULL
6 A 1
7 A 2
8 A 3
9 B 1
10 B 2
11 B 3
12 NULL
13 B 1
14 B 2
15 B 3
16 C 1
17 C 2
18 C 3
19 C 4
这看起来像是一个缺口和孤岛问题。假设您有另一列定义记录的顺序(例如,id
),这是一种使用行号之间的差异来定义相邻记录组的方法:
select
var,
case when var is not null
then row_number() over(partition by var, rn1 - rn2 order by id)
end rnk
from (
select
t.*,
row_number() over(order by id) rn1,
row_number() over(partition by var order by id) rn2
from mytable t
) t
order by id
请注意,window 功能仅在最新的 MySQL 版本(即 8.0 版)中可用。