Функция окна SQL не дает мне правильный вывод - PullRequest
2 голосов
/ 10 октября 2019
A     B   C   D
1pm   a   1   1
2pm   a   2   2
3pm   b   1   1
4pm   b   2   2
5pm   a   3   1
6pm   a   4   2

Когда я делаю row_number() over (partition by B order by A) as C ., я получаю столбец C. Как получить столбец D?

1 Ответ

1 голос
/ 10 октября 2019

Вам необходимо присвоить группу «смежным» значениям. Одним простым методом является разность номеров строк:

select a, b, 
       row_number() over (partition by b, (seqnum_a - seqnum_ab) order by a) as d
from (select t.*,
             row_number() over (order by a) as seqnum_a,
             row_number() over (partition by b order by a) as seqnum_ab
      from t
     ) t;

Разница номеров строк - это одно из решений некоторых типов проблем с пробелами и островками (в основном то, что вы просите). Почему это работает, немного сложно объяснить. Я обнаружил, что если кто-то увидит результаты подзапроса, он, как правило, поймет, почему разница определяет соседние строки.

...