Agrupando registros com base em intervalos de tempo

12

Tenho uma tabela com o esquema a seguir e preciso definir uma consulta que possa agrupar dados com base em intervalos de tempo ( por exemplo, registros por minuto ) e, em seguida, fornecer a soma das alterações no SnapShotValue desde o grupo anterior. No momento, o SnapShotValue sempre aumenta, então eu só preciso da soma das diferenças. Alguém pode ajudar com uma consulta T-SQL do SQL Server que possa 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 Desejada

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
JoeGeeky
fonte

Respostas:

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)fornece o número de minutos desde então 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)adiciona o número de minutos desde 1900-01-01T00:00:00que 1900-01-01T00:00:00terminou com um datetime com apenas alguns 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 com 5e multiplique com 5os minutos arredondados para uma precisão de 5 minutos. Isso funciona porque o resultado de uma divisão inteira no SQL Server é um número inteiro.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)
Mikael Eriksson
fonte
Isso forneceu uma boa estrutura para a resposta, mas ainda estou com alguns problemas para entender como isso funciona. Quando tentei alterar o deslocamento de um intervalo de 1 minuto para um intervalo de 5 minutos, ainda assim recebo um intervalo de 1 minuto com o resultado inteiro começando em um ponto de início diferente. Isso é muito provável porque estou entendendo mal como isso funciona. Você poderia fornecer mais uma amostra mostrando um intervalo diferente de 1 minuto? Obrigado ...
JoeGeeky
0

Estou um pouco confuso com o terceiro exemplo, é 1325? Com base nos requisitos de captura da soma dos valores de snapshot, a consulta abaixo deve ter o que você procura.

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

A seguir, é apresentada a tradução da resposta aceita no PostgreSQL (eu escolhi 1º de janeiro de 2000 como a data base. Altere-a para uma data anterior se seus dados forem mais antigos do que isso):

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' 
LoMaPh
fonte