使用 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 版)中可用。