web-dev-qa-db-fra.com

Regroupement des enregistrements basés sur des intervalles de temps

J'ai une table avec le schéma suivant et j'ai besoin de définir une requête pouvant collecter des données basées sur des intervalles de temps (enregistrements ex. Par minute), puis fournir la somme des modifications apportées à l'instantané SnapshotValue depuis le groupe précédent. À l'heure actuelle, le SnapshotValue est toujours incréments, donc je n'ai besoin que de la somme des différences. Quelqu'un peut-il aider avec une requête SQL Server T-SQL qui pourrait faire cela? Je suis ouvert à changer le schéma, mais c'est ce que j'ai actuellement.

Schéma

CaptureTime   (datetime)
SnapShotValue (int)

Échantillons de données

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

Résultat de la requête souhaitée

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

Je suis un peu confus par le 3ème exemple là-bas, est-ce censé être 1325? Basé sur les exigences relatives à la capture de la somme de la SnapShotValues, la requête ci-dessous devrait obtenir ce que vous avez après.

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

Ce qui suit est la traduction de la réponse acceptée dans PostgreSQL (j'ai choisi le 1er janvier 2000, comme date de base. Changez-la à une date antérieure si vos données sont plus anciennes que cela):

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