Agregación de datos por hora de SQL en postgresql

9

Soy un novato con base de datos, así que estoy buscando su ayuda con este.

Tengo una tabla que contiene datos de series de tiempo.

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

La tabla almacena datos basados ​​en intervalos manteniendo solo el límite superior del intervalo. Por ejemplo, la primera fila representa un intervalo de [00:00 - 00:10] con un valor de 10, la segunda fila representa un intervalo de (00:10 - 00:30] con un valor de 5 y la tercera representa un intervalo de (00:30 - 01:00) con un valor de 10.

Necesito una consulta eficiente en Postgres para agregar datos por hora para una estructura como la descrita anteriormente. Entonces el resultado sería algo como esto:

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

Tenga en cuenta que los datos de la serie temporal son grandes, por lo que cualquier ayuda para indexar esto sería muy apreciada.

Gracias dan

dan
fuente
1
En sus datos de muestra, por ejemplo 2012/01/01 00:10, 10, ¿están todos esos valores en una sola columna, o es la coma un delimitador de columna? Además, ¿se garantiza que las horas exactas (1:00, 2:00, 3:00, etc.) se almacenan en la tabla de series de tiempo, o podría saltarse el: 00 y tener entradas como 2012/01/01 03:50seguidas por 2012/01/01 04:10?
dartonw
¿Qué pasa si tiene una hora sin datos de origen? ¿Todavía quieres una salida como 2012/01/01 04:00, 2012/01/01 05:00, 0? ¿o debería omitirse esa hora del resumen?
Joshua Huber
@dartonw: la coma es un delimitador de columna. Entonces, la fecha, la hora y el valor son columnas diferentes en una tabla. Se garantiza que las horas exactas siempre se almacenarán.
dan

Respuestas:

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

ver sqlfiddle

En cuanto al índice: podría probar un índice de función date_trunc('hour', t - interval '1 minute')pero no estoy seguro de que postgresql pueda usarlo.

León
fuente
Gracias, mi jefe está feliz. Pero si necesita un enfoque preciso real basado en la ciencia , estudie para trabajar con funciones de ventana. PostgreSQL los admite de forma nativa: no0p.github.io/postgresql/2014/05/08/timeseries-tips-pg.html
Brian Haak
¡Votado! ¿cómo harías esto si fueran 30 minutos en lugar de 1 hora?
PirateApp