Agrupando registros basados ​​en intervalos de tiempo


12

Tengo una tabla con el siguiente esquema, y ​​necesito definir una consulta que pueda agrupar datos en función de intervalos de tiempo ( Ej. Registros por minuto ) y luego proporcionar la suma de los cambios en el SnapShotValue desde el grupo anterior. En la actualidad, SnapShotValue siempre se incrementa, por lo que solo necesito la suma de las diferencias. ¿Alguien puede ayudar con una consulta SQL Server T-SQL que podría hacer esto? Estoy abierto a cambiar el esquema, pero esto es lo que tengo actualmente.

Esquema

CaptureTime   (datetime)
SnapShotValue (int)

Data de muestra

1 Jan 2012 00:00:00,   100
1 Jan 2012 00:00:30,   125
1 Jan 2012 00:01:00,   200
1 Jan 2012 00:01:30,   300
1 Jan 2012 00:02:15,   400
1 Jan 2012 00:02:30,   425
1 Jan 2012 00:02:59,   500

Resultado de consulta deseado

1 Jan 2012 00:01:00,   225 -- Sum of all captured data changes up to the 1 minute mark
1 Jan 2012 00:02:00,   500 -- Sum of all captured data changes up to the 2 minute mark
1 Jan 2012 00:03:00,   125 -- Sum of all captured data changes up to the 3 minute mark

Respuestas:


17
select dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0),
       sum(SnapShotValue)
from YourTable
group by dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)

SE-Data

datediff(minute, 0, CaptureTime)te da la cantidad de minutos desde entonces 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)agrega el número de minutos desde 1900-01-01T00:00:00que 1900-01-01T00:00:00terminaron con una fecha y hora con solo minutos.

El 1+está ahí porque querías el siguiente minuto.

Para hacer lo mismo con un intervalo de 5 minutos, debe hacer algunos cálculos. Dividir los minutos con 5y multiplicar con 5le da los minutos redondeados a una precisión de 5 minutos. Esto funciona porque el resultado de una división de enteros en SQL Server es un entero.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)

Esto proporcionó un buen marco para la respuesta, pero todavía tengo problemas para entender cómo funciona. Cuando intenté cambiar el desplazamiento de un intervalo de 1 minuto a un intervalo de 5 minutos, todavía obtengo un intervalo de 1 minuto con el resultado completo comenzando en un punto de inicio diferente. Esto es muy probable porque no entiendo cómo funciona esto. ¿Podría proporcionar una muestra más que muestre un intervalo distinto de 1 minuto? Gracias ...
JoeGeeky

0

Estoy un poco confundido por el tercer ejemplo, ¿se supone que esto es 1325? Según los requisitos de capturar la suma de los valores de la instantánea, la siguiente consulta debería obtener lo que busca.

select dateadd(minute,1,convert(varchar(20),capturetime)), sum(snapshotvalue)
from snapshotdata sd
group by dateadd(minute,1,convert(varchar(20),capturetime))

0

La siguiente es la traducción de la respuesta aceptada a PostgreSQL (elegí el 1 de enero de 2000, como la fecha base. Cámbielo a una fecha anterior si sus datos son anteriores):

SELECT 
  TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
  , SUM(SnapShotValue)
FROM table_name
GROUP BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
ORDER BY TIMESTAMP '2000-01-01 00:00:00' + 1 + DATE_PART('minute', CaptureTime - TIMESTAMP '2000-01-01 00:00:00') * INTERVAL '1 minute' 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.