Группировать результаты по диапазону дат - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть таблица со столбцом timestamp в PostgreSQL, и мне нужно рассчитывать взаимодействия в течение 24 часов. Пример данных:

CREATED
-----------------
2019-04-03 17:20:50
2019-04-03 17:20:59
2019-04-03 18:41:18
2019-04-04 09:58:49
2019-04-04 09:58:53
2019-04-04 09:58:59
2019-04-04 10:01:55
2019-04-04 14:52:52
2019-04-04 15:10:43
2019-04-04 15:10:53
2019-04-04 17:15:39

Ожидаемый результат:

MIN(CREATED)            MAX(CREATED)          TOTAL
2019-04-03 17:20:50     2019-04-04 17:15:39   11

У меня сейчас есть скрипт, в котором я конвертирую дату в секунды, но получаю следующее:

SELECT
    TIMESTAMP WITH TIME ZONE 'epoch' +
    INTERVAL '1 second' * trunc(extract('epoch' from created) / 86400) * 86400 as filtro,
    min(created),
    max(created),
    count(*)
FROM whts
GROUP BY filtro
ORDER BY max(created) desc;

FILTRO                      MIN(CREATED)                MAX(CREATED)                TOTAL
2019-04-04 00:00:00.000000  2019-04-04 09:58:49.000000  2019-04-04 17:15:39.000000  8
2019-04-03 00:00:00.000000  2019-04-03 17:20:50.000000  2019-04-03 18:41:18.000000  3

Он должен возвращать одну строку, поскольку первый created был: 2019-04-03 17: 20: 50 и последний 2019-04-04 17: 15: 39 . Нет 24 часа прошло.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019
SELECT min(created)
     , max(created)
     , count(*)
FROM   whts
GROUP  BY date_trunc('day', created - time '17:20:50')  -- time of the start
ORDER  BY max(created) DESC;

Основной трюк состоит в том, чтобы вычесть временную составляющую начала (значения сдвига, чтобы соответствовать дневной сетке), тогда вы можете просто использовать date_trunc() для формирования групп.

Лучший способ определить смещение зависит от отсутствующего определения задачи ... с чего начать или закончить это?

Чтобы начать с самого раннего created в таблице:

SELECT min(created)
     , max(created)
     , count(*)
FROM   whts, (SELECT min(created)::time FROM whts) t(t_start)
GROUP  BY date_trunc('day', created - t.t_start) 
ORDER  BY max(created) DESC;
0 голосов
/ 05 апреля 2019

Вы не можете использовать функцию усечения, поскольку это для вашего требуемого результата. Может быть, вы можете попробовать что-то вроде следующего: trunc ((извлечь ('эпоха' из (создан- (выберите мин (создан) из whts)) / 86400) * 86400

...