#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<> .