Сброс номера строки в соответствии с изменением данных записи
У меня есть набор данных, как следует
name date
x 2014-01-01
x 2014-01-02
y 2014-01-03
x 2014-01-04
и я пытаюсь получить этот результат
name date row_num
x 2014-01-01 1
x 2014-01-02 2
y 2014-01-03 1
x 2014-01-04 1
я пытался выполнить этот запрос
select name,
date,
row_number () over (partition by name order by date) as row_num
from myTBL
но к сожалению я получаю этот результат
name date row_num
x 2014-01-01 1
x 2014-01-02 2
y 2014-01-03 1
x 2014-01-04 3
пожалуйста помоги.
1 ответ
Решение
Вам необходимо определить группы names
которые происходят вместе. Вы можете сделать это с разницей номеров строк. Затем используйте grp
для разделения row_number()
:
select name, date,
row_number() over (partition by name, grp order by date) as row_num
from (select t.*,
(row_number() over (order by date) -
row_number() over (partition by name order by date)
) as grp
from myTBL t
) t
Для ваших образцов данных:
name date 1st row_number 2nd Grp
x 2014-01-01 1 1 0
x 2014-01-02 2 2 0
y 2014-01-03 3 1 2
x 2014-01-04 4 3 1
Это должно дать вам представление о том, как это работает.