Группировка / Оконный улей - PullRequest
0 голосов
/ 23 января 2020

На рисунке ниже первая таблица (рассматриваемый скрипт), а вторая ожидаемый результат. В столбце C у нас есть различные элементы, такие как T1, T2, T3, и записи будут доступны в группах, записи T1, а затем T2 или T3. между ними не должно быть никакого разрыва, T1 запустится и завершится sh, и тогда может появиться только элемент T2. Но если T1 появляется после других предметов, я хочу рассмотреть это по-другому. Какие есть варианты для достижения результата в улье / искре?

Я попытался с рангом в одном столбце, а затем со следующим значением в других столбцах и попытался выполнить некоторые сравнения, но это не помогло.

Любые указатели, пожалуйста

imageenter image description here">

CREATE TABLE TEST_A (A STRING, B STRING, C STRING);

INSERT INTO TEST_A (A, B, C) VALUES ('a','1-Jan','T1'), ('a','2-Jan','T1'),('a','3-Jan','T2'),('a','4-Jan','T3') ,('a','5-Jan','T1'),('a','6-Jan','T1')

1 Ответ

0 голосов
/ 23 января 2020

Это проблема разрыва и островов. Я собираюсь предложить поместить каждый «остров» смежных строк в отдельный ряд.

Один из подходов, который работает в этом случае, заключается в использовании разности номеров строк:

select a, c, min(b), max(b)
from (select t.*,
             row_number() over (partition by a order by b) as seqnum,
             row_number() over (partition by a, c order by b) as seqnum_2
      from t
     ) t
group by a, c, (seqnum - seqnum_2);

Вы можете развернуть это в несколько столбцов, если вы действительно хотите. Тем не менее, я думаю, что это только запутывает проблему, потому что вы можете не знать, сколько групп существует для данной комбинации a / c.

...