Получите инкрементное число, используя раздел на In mysql - PullRequest
1 голос
/ 26 февраля 2020

У меня есть несколько уникальных сценариев

Ввод:

   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. Но если между ними есть ноль, Ранг должен сбросить свой счетчик.

Ожидаемый результат:

   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

1 Ответ

1 голос
/ 26 февраля 2020

Это похоже на проблему разрывов и островков. Предполагая, что у вас есть другой столбец, который определяет порядок записей (скажем, 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 

Примечание что оконные функции доступны только в последней версии MySQL (то есть версии 8.0).

...