Почасовая агрегация данных SQL в postgresql

9

Я новичок с базой данных, поэтому я ищу вашу помощь с этим.

У меня есть таблица, содержащая данные временных рядов.

2012/01/01 00:10, 10
2012/01/01 00:30, 5
2012/01/01 01:00, 10
2012/01/01 01:40, 10
2012/01/01 02:00, 20

Таблица хранит данные на основе интервалов, сохраняя только верхний предел интервала. Например, первая строка представляет интервал от [00:00 - 00:10] со значением 10, вторая строка представляет интервал от (00:10 - 00:30] со значением 5, а третья представляет интервал от (00:30 до 01:00) со значением 10.

Мне нужен эффективный запрос в Postgres для агрегирования почасовых данных для структуры, подобной описанной выше. Таким образом, результат будет примерно таким:

2012/01/01 00:00, 2012/01/01 01:00, 25
2012/01/01 01:00, 2012/01/01 02:00, 30

Обратите внимание, что данные временного ряда велики, поэтому любая помощь в индексации будет высоко оценена.

Спасибо дан

Дан
источник
1
Например 2012/01/01 00:10, 10, в данных примера все эти значения находятся в одном столбце, или запятая является разделителем столбца? Кроме того, точные часы (1:00, 2:00, 3:00 и т. Д.) Гарантированно будут сохранены в таблице временных рядов или они могут пропустить: 00 и иметь такие записи, как 2012/01/01 03:50после 2012/01/01 04:10?
Дартонв
Что делать, если у вас есть час без исходных данных? Вы все еще хотите вывод, как 2012/01/01 04:00, 2012/01/01 05:00, 0? или этот час должен быть пропущен в резюме?
Джошуа Хубер
@dartonw - запятая является разделителем столбцов. Таким образом, дата и время - это разные столбцы в таблице. Точные часы гарантированно будут храниться всегда.
Дан

Ответы:

8
select
  date_trunc('hour', t - interval '1 minute') as interv_start,
  date_trunc('hour', t - interval '1 minute')  + interval '1 hours' as interv_end,
 sum(v)
  from myt 
    group by date_trunc('hour', t - interval '1 minute')
order by interv_start

см. sqlfiddle

Что касается индекса: вы можете попробовать использовать индекс функции, date_trunc('hour', t - interval '1 minute')но я не уверен, что postgresql может его использовать.

Лео
источник
Спасибо, мой босс счастлив. Но если вам нужен настоящий точный научный подход, пожалуйста, учитесь работать с оконными функциями. PostgreSQL поддерживает их изначально: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Брайан Хаак
upvoted! как бы вы сделали это, если бы это было 30 минут вместо 1 часа
PirateApp