Tenho uma tabela com o esquema a seguir, e preciso definir uma consulta que possa agrupar dados com base em intervalos de tempo ( Ex. registros por minuto ) e depois fornecer a soma das alterações no SnapShotValue desde o grupo anterior. No momento, o SnapShotValue sempre é incrementado, então eu só preciso da soma das diferenças. Alguém pode ajudar com uma consulta SQL Server T-SQL que pode fazer isso? Estou aberto a alterar o esquema, mas é o que tenho atualmente.
Esquema
CaptureTime (datetime)
SnapShotValue (int)
Dados de amostra
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 da consulta desejado
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
SE-Dados
datediff(minute, 0, CaptureTime)
dá-lhe o número de minutos desde1900-01-01T00:00:00
.dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)
adiciona o número de minutos desde1900-01-01T00:00:00
o1900-01-01T00:00:00
término com um datetime com apenas minutos.O
1+
está lá porque você queria o próximo minuto.Para fazer o mesmo com um intervalo de 5 minutos você precisa fazer alguns cálculos. Divida os minutos por
5
e multiplique por5
fornece os minutos arredondados para uma precisão de 5 minutos. Isso funciona porque o resultado de uma divisão inteira no SQL Server é um inteiro.A seguir está a tradução da resposta aceita para o PostgreSQL (eu escolhi 1º de janeiro de 2000 como data base. Altere para uma data anterior se seus dados forem mais antigos que isso):
Estou um pouco confuso com o terceiro exemplo, isso deveria ser 1325? Com base nos requisitos de captura da soma dos valores do instantâneo, a consulta abaixo deve obter o que você procura.