Agregação de dados por hora do SQL no postgresql

9

Eu sou um novato no banco de dados, então estou procurando sua ajuda com este.

Eu tenho uma tabela contendo dados de séries temporais.

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

A tabela está armazenando dados com base no intervalo, mantendo apenas o limite superior do intervalo. Por exemplo, a primeira linha representa um intervalo de [00:00 - 00:10] com um valor de 10, a segunda linha representa um intervalo de (00:10 - 00:30] com um valor de 5 e a terceira representa um intervalo de (00:30 - 01:00) com um valor de 10.

Eu preciso de uma consulta eficiente no Postgres para agregar dados por hora para uma estrutura como a descrita acima. Portanto, o resultado seria algo como isto:

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

Observe que os dados das séries temporais são grandes, portanto, qualquer ajuda com a indexação seria muito apreciada.

Obrigado dan

dan
fonte
11
Nos dados de amostra, por exemplo 2012/01/01 00:10, 10, todos esses valores estão em uma única coluna ou a vírgula é um delimitador de coluna? Além disso, as horas exatas (1:00, 2:00, 3:00 etc.) são garantidas para serem armazenadas na tabela de séries temporais ou podem pular o: 00 e ter entradas como as 2012/01/01 03:50seguidas por 2012/01/01 04:10?
dartonw
E se você tiver uma hora sem dados de origem? Você ainda quer uma saída como 2012/01/01 04:00, 2012/01/01 05:00, 0? ou essa hora deve ser omitida do resumo?
Joshua Huber
@artonw - a vírgula é um delimitador de coluna. Portanto, a data e o valor são colunas diferentes em uma tabela. As horas exatas são garantidas para serem sempre armazenadas.
dan

Respostas:

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

veja sqlfiddle

Quanto ao índice: você pode tentar um índice de função, date_trunc('hour', t - interval '1 minute')mas não tenho certeza se o postgresql pode usá-lo.

Leo
fonte
Obrigado, meu chefe está feliz. Mas se você precisar de uma abordagem precisa baseada na ciência , estude para trabalhar com as funções da janela. PostgreSQL suporta-los nativamente: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak
votado! como você faria isso se este foi 30 minutos em vez de uma hora
PirateApp