Совокупность окон Presto SQL, оглядывающаяся назад на x часов / минут / секунд - PullRequest
0 голосов
/ 17 января 2019

Я хочу сделать агрегирование на presto sql, оглядываясь назад на x часов / минут / секунд назад.

Данные

id    |       timestamp       |    status
-------------------------------------------
A     |   2018-01-01 03:00:00 |     GOOD
A     |   2018-01-01 04:00:00 |     BAD
A     |   2018-01-01 05:00:00 |     GOOD
A     |   2018-01-01 09:00:00 |     BAD
A     |   2018-01-01 09:15:00 |     BAD
A     |   2018-01-01 13:00:00 |     GOOD
A     |   2018-01-01 14:00:00 |     GOOD
B     |   2018-02-01 09:00:00 |     GOOD
B     |   2018-02-01 10:00:00 |     BAD

Результаты:

id    |       timestamp       |    status    | bad_status_count
----------------------------------------------------------------
A     |   2018-01-01 03:00:00 |     GOOD     |       0 
A     |   2018-01-01 04:00:00 |     BAD      |       1
A     |   2018-01-01 05:00:00 |     GOOD     |       1
A     |   2018-01-01 09:00:00 |     BAD      |       1
A     |   2018-01-01 09:15:00 |     BAD      |       2
A     |   2018-01-01 13:00:00 |     GOOD     |       0 
A     |   2018-01-01 14:00:00 |     GOOD     |       0
B     |   2018-02-01 09:00:00 |     GOOD     |       0
B     |   2018-02-01 10:00:00 |     BAD      |       1

Я считаю плохой статус за последние 3 часа по делам. Как я могу это сделать? Я пытаюсь что-то вроде этого:

SELECT
  id,
  timestamp,
  status
  count(status) over(partition by id order by timestamp range between interval '3' hour and current_row) as bad_status_count
from table

Конечно, это еще не работает, и мне все еще приходится отфильтровывать плохое состояние. Я получил эту ошибку: Error running query: line 7:1: Window frame start value type must be INTEGER or BIGINT(actual interval day to second)

1 Ответ

0 голосов
/ 17 января 2019

Я не на 100% представляю, как выразить это в PrestoDB, но ключевая идея - преобразовать метки времени в часы:

select t.*,
       sum(case when status = 'Bad' then 1 else 0 end) over
           (partition by id
            order by hours
            range between -3 and current row
           ) as bad_status
from (select t.*,
             date_diff(hour, '2000-01-01', timestamp) as hours
      from t
     ) t;
...