Regroupement des enregistrements en fonction des intervalles de temps

12

J'ai une table avec le schéma suivant, et je dois définir une requête qui peut regrouper des données en fonction d'intervalles de temps ( ex. Enregistrements par minute ), puis fournir la somme des modifications apportées à SnapShotValue depuis le groupe précédent. À l'heure actuelle, le SnapShotValue incrémente toujours 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 le faire? Je suis ouvert à changer le schéma, mais c'est ce que j'ai actuellement.

Schéma

CaptureTime   (datetime)
SnapShotValue (int)

Exemples 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 requête souhaité

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
la source

Réponses:

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)vous donne le nombre de minutes depuis 1900-01-01T00:00:00.

dateadd(minute, 1+datediff(minute, 0, CaptureTime), 0)ajoute le nombre de minutes écoulées depuis 1900-01-01T00:00:00pour 1900-01-01T00:00:00aboutir à un datetime avec seulement des minutes.

Le 1+est là parce que tu voulais la minute suivante.

Pour faire de même avec un intervalle de 5 minutes, vous devez faire quelques calculs. Divisez les minutes avec 5et multipliez avec 5pour obtenir les minutes arrondies à une précision de 5 minutes. Cela fonctionne car le résultat d'une division entière dans SQL Server est un entier.

dateadd(minute, 5 + (datediff(minute, 0, CaptureTime) / 5) * 5, 0)
Mikael Eriksson
la source
Cela a fourni un cadre agréable pour la réponse, mais j'ai toujours un peu de mal à comprendre comment cela fonctionne. Lorsque j'ai essayé de changer le décalage d'un intervalle de 1 minute à un intervalle de 5 minutes, j'obtiens toujours un intervalle de 1 minute avec le résultat entier commençant à un point de départ différent. C'est très probablement parce que je ne comprends pas comment cela fonctionne. Pourriez-vous fournir un autre échantillon montrant un intervalle autre que 1 minute? Merci ...
JoeGeeky
0

Je suis un peu confus par le 3ème exemple, est-ce censé être 1325? En fonction des exigences de capture de la somme des valeurs de cliché, la requête ci-dessous devrait obtenir ce que vous recherchez.

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

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. Modifiez-la à une date antérieure si vos données sont plus anciennes):

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
la source