Как мне агрегировать по непрерывной последовательности событий, происходящих циклически?

#sql #postgresql

#sql #postgresql

Вопрос:

Таблица:

индикация число
остановка 6
остановка 2
начать 3
начать 8
остановка 7
остановка 3
остановка 2
начать 8
начать 3

Вывод решения:

индикация sum_values
остановка 8
начать 11
остановка 12
начать 11
 WITH stop_start(indication, num) AS (
VALUES 
('stop' , 6),
('stop' , 2),
('start' , 3),
('start' , 8),
('stop' , 7),
('stop' , 3),
('stop' , 2),
('start' , 8),
('start' , 3)
)

SELECT * FROM stop_start;

 

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

1. Пожалуйста, объясните логику. И если вы предполагаете порядок строк, то SQL требует, чтобы столбец содержал порядок.

Ответ №1:

Это проблема с пробелами и островами — при условии, что у вас есть столбец, который задает порядок. Вероятно, самым простым решением является использование разницы номеров строк для идентификации групп:

 select indication, sum(num)
from (select ss.*,
             row_number() over (partition by indication order by ?) as seqnum_2,
             row_number() over (order by ?) as seqnum
      from stop_start ss
     ) ss
group by indication, (seqnum - seqnum_2);
 

Это ? для столбца, который задает порядок.

Вот db<>fiddling .