SQL находит среднее значение разницы во времени между двумя строками в зависимости от условий - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть сценарий использования, который я пытаюсь решить с помощью SQL-запроса.

Механизм запросов основан на Presto 0.172, https://prestodb.io/

Допустим, у меня есть такие данные

+----------+------------+-------------+------+--------------------------+
| location | actiontype | actionstate | uuid |     lastupdatedtime      |
+----------+------------+-------------+------+--------------------------+
| x        | type1      | start       |  123 | 2018-09-09T16:54:37.648Z |
| x        | type1      | start       |  123 | 2018-09-09T16:55:37.648Z |
| x        | type1      | start       |  123 | 2018-09-09T16:56:37.648Z |
| x        | type1      | end         |  123 | 2018-09-09T16:57:37.648Z |
| x        | type1      | end         |  123 | 2018-09-09T16:58:37.648Z |
| y        | type1      | start       |  567 | 2018-09-09T14:57:37.648Z |
| y        | type1      | end         |  567 | 2018-09-09T14:58:37.648Z |
+----------+------------+-------------+------+--------------------------+

Я пытаюсь найти среднюю разницу во времени, когда конкретный тип действия скажет, что type1 начинается и заканчивается для данного uuid

т.е.. сгруппировать по UUID, типу действия и местоположению

В некоторых случаях у меня может быть несколько записей для одного и того же типа действия и состояния действия, и в этом случае мне нужно выбрать МАКС (время последнего обновления)

что-то вроде

select AVG(date_diff( MAX(lastupdatedtime of start)) and MAX(lastupdatedtime of end)

в таблице данных группировка по местоположению, тип действия, uuid.

1 Ответ

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

Вы можете использовать условное агрегирование в вычитании.

select TIMEDIFF(MAX(case when actionstate='end' then lastupdatedtime end)
               ,MAX(case when actionstate='start' then lastupdatedtime end)
               )
from datatable 
where actionstate in ('start','end')
group by location, actiontype, uuid
having count(distinct actionstate) = 2

avg не требуется, поскольку существует только один результат для объединения группы по столбцам.

...