Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment regrouper par n'importe quel intervalle de temps ?

Je pense que vous compliquez trop les choses.
Vous pouvez utiliser GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 pour un regroupement toutes les 30 minutes. Bien sûr, la date que j'ai choisie n'est qu'une date aléatoire. Vous pouvez choisir, si vous le souhaitez, la première (ou la dernière) date dans vos exemples de données.
Et vous pouvez également utiliser cette technique pour obtenir chaque intervalle de n'importe quelle partie de temps - changez simplement le mot-clé MINUTE à n'importe quelle partie de date que vous souhaitez utiliser, et l'intervalle 30 à n'importe quel intervalle que vous voulez.

Considérez les exemples de données suivants :

;WITH CTE AS 
(
    SELECT CAST('2017-01-01T00:00:00' as datetime) As TheDateTime, 0 as rn
    UNION ALL
    SELECT DATEADD(MINUTE, 1, TheDateTime), rn + 1
    FROM CTE
    WHERE rn < 60
)

SELECT TheDateTime, rn INTO #T
FROM CTE
OPTION(MAXRECURSION 0)

#T contient maintenant les données suivantes :

TheDateTime                 rn
2017-01-01 00:00:00.000     0
2017-01-01 00:01:00.000     1
2017-01-01 00:02:00.000     2
2017-01-01 00:03:00.000     3
...
2017-01-01 00:59:00.000     59
2017-01-01 01:00:00.000     60

Pour obtenir le maximum de rn regroupés par 30 minutes, il vous suffit de ceci :

SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30

Résultats :

interval    max_rn
0           29
1           59
2           60