Условно сумма последовательных строк с SQL - PullRequest
0 голосов
/ 03 сентября 2018

Мои данные доставляются мне в 5-минутных пакетах. Я читаю состояние устройства по секундам и уже построил скрипт для агрегирования последовательных строк одного и того же статуса с помощью панд. Мои данные выглядят примерно так.

timestamp   status     length
00:00:00    1          38
00:00:38    0          72
00:01:50    1          27
...

Я собираюсь запросить 5-минутные пакеты за полные дни, при этом 5-минутные пакеты не будут заметны. В настоящее время, когда я выполняю запросы к нескольким пакетам в AWS Athena, я вижу, что последовательные строки одного и того же статуса не агрегируются.

, например

timestamp status length
00:04:02 1 24
00:04:26 0 15
00:04:41 1 19
00:05:00 1 11
00:05:11 0 8
00:05:19 1 22
...

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

timestamp status length
00:04:02 1 24
00:04:26 0 15
00:04:41 1 30
00:05:11 0 8
00:05:19 1 22
...

Есть ли в SQL возможность вернуть этот запрос в соответствии с приведенной выше структурой?

1 Ответ

0 голосов
/ 03 сентября 2018

Это проблема "пробелов и островов". Amazon Athena поддерживает row_number(), поэтому вы можете решить эту проблему методом разности номеров строк:

select status, min(timestamp) as timestamp, sum(length) as length
from (select t.*,
             row_number() over (order by timestamp) as seqnum,
             row_number() over (partition by status order by timestamp) as seqnum_s
      from t
     ) t
group by status, (seqnum - seqnum_s);
...