Добавляйте идентификатор группы после каждого цикла в SQL

#sql #amazon-redshift

#sql #amazon-redshift

Вопрос:

У меня есть таблица, которая выглядит так

Имя время события событие_тип
a 2020-01-01 выполнить
a 2020-01-03 выполнить
a 2020-01-05 конец
a 2020-01-18 выполнить
a 2020-01-29 конец
b 2020-02-12 выполнить
b 2020-03-01 конец

Я хочу создать идентификатор группы (или какое-либо имя группы), чтобы сгруппировать каждый цикл выполнения для каждого имени, чтобы приведенная выше таблица выглядела следующим образом:

Имя время события событие_тип группа_id
a 2020-01-01 выполнить 1
a 2020-01-03 выполнить 1
a 2020-01-05 конец 1
a 2020-01-18 выполнить 2
a 2020-01-29 конец 2
b 2020-02-12 выполнить 3
b 2020-03-01 конец 3

Я попробовал row_number(), а также использовал раздел row_number для вычитания друг из друга, но на самом деле это не дает мне того, что я хочу.

Комментарии:

1. Я использую redshift. добавление postgresql, как я думал, redshift основано на postgres

Ответ №1:

Вы хотите подсчитать event_type = ‘end’ до предыдущей строки:

 select count(case when event_type = 'end' then 1 end) 
         over (order by event_time
               rows between unbounded preceding and 1 preceding)   1 as group_id
from mytable
order by event_time;
 

Ответ №2:

Хммм … вам кажется, что это совокупная сумма 'end' s — но в обратном порядке. Затем это даст вам нумерацию в обратном порядке, так что вы можете использовать некоторое вычитание.

Идея заключается в:

 select t.*,
       (1   sum( (event_type = 'end')::int ) over () -
        sum( (event_type = 'end')::int ) over (order by event_time desc)
       ) as group_id
from t
order by event_time;
 

Вот скрипка db<> .