Агрегирование записей о событиях в PostgreSQL - PullRequest
0 голосов
/ 12 марта 2012

У меня есть таблица event с полем отметки времени и ряд других полей, содержащих статистику, собранную в доильном зале.

Мне нужно вычислять средние, суммы и подсчеты в этих полях для каждого 12-часового периода с 6:00 до 18:00, а затем с 18:00 до 6:00 следующего дня.

1 Ответ

3 голосов
/ 12 марта 2012

Может выглядеть так:

Тестовая настройка:

-- DROP TABLE t;
CREATE TEMP TABLE t (ts timestamp, val1 int, val2 int);
INSERT INTO t VALUES
 ('2012-03-12 06:00:00', 1, 12)
,('2012-03-12 06:00:21', 2, 2)
,('2012-03-12 06:53:21', 3, 45)
,('2012-03-12 07:53:21', 8, 7)
,('2012-03-12 08:53:21', 8, 6)
,('2012-03-12 09:53:21', 6, 23)
,('2012-03-12 10:53:21', 23, 43)
,('2012-03-12 18:00:00', 4, 58)
,('2012-03-12 19:00:00', 6, 57)
,('2012-03-12 20:00:00', 8, 32)
,('2012-03-13 20:00:00', 7, 12)
,('2012-03-13 20:00:00', 9, 15)
,('2012-03-14 20:00:00', 14, 14);

Запрос:

SELECT (ts - interval '6h')::date AS day
      ,CASE WHEN ts::time >= '6:00'::time
             AND ts::time  < '18:00'::time
         THEN '6-18'
         ELSE '18-6'
       END AS shift
      ,sum(val1) AS val1_sum
      ,sum(val2) AS val2_sum
      ,count(*) As ct
FROM   t
GROUP  BY 1,2
ORDER  BY 1,2;

Результат:

    day     | shift | val1_sum | val2_sum | ct
------------+-------+----------+----------+----
 2012-03-12 | 6-18  |       51 |      138 |  7
 2012-03-12 | 18-6  |       18 |      147 |  3
 2012-03-13 | 18-6  |       16 |       27 |  2
 2012-03-14 | 18-6  |       14 |       14 |  1

Обратите внимание, как я сдвигаю время, чтобы получить согласованную дату, и как я использую >= и < для точных диапазонов времени.

...