Как взять только последние две строки postgres с группировкой по функциям - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть таблица задач, подобная этой

id      timestamp                               event_type
2           "2018-12-17 09:25:05"               open
2           "2018-12-17 09:26:05"               cancel
2           "2018-12-17 09:27:05"               open
2           "2018-12-17 09:29:05"               closed
3           "2018-12-17 09:25:05"               open
3           "2018-12-17 09:28:05"               closed

, и мне нужно получить данные, основанные на разнице между открытым и закрытым событием, но только последним открытым и закрытым событием, а не между ними.Например, задача 2 отменяется в промежутке, поэтому необходимо рассчитать разницу между только последними 2 событиями («открытие», «закрытие»)

вывод похож на

Task    Time taken
2       2:00
3       3:00

Я проверилнекоторые функции array_agg, но это не похоже на работу.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Вы можете попробовать ниже -

select id, 
  DATE_PART(
        'minute',
        max(case when event_type='open' then timestamp end)::timestamp -
        max(case when event_type='closed' then timestamp end)::timestamp
       )
from tablename
group by id
0 голосов
/ 21 декабря 2018

Я думаю, lag() - более безопасное решение:

select id, (timestamp - prev_open_timestamp)
from (select e.*,
             max(timestamp) filter (where event_type = 'open') over (partition by id order by timestamp) as prev_open_timestamp
      from events e
     ) e
where event_type = 'closed';

Это будет работать, даже если после close.

есть open.
0 голосов
/ 21 декабря 2018

демо: дБ <> скрипка

SELECT 
    id,
    MAX(ts) FILTER (WHERE event_type = 'closed') -
    MAX(ts) FILTER (WHERE event_type = 'open') as time_taken
FROM
    events
GROUP BY id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...