Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come si raggruppa in base a un intervallo basato sul tempo?

Penso che tu abbia finito di complicare le cose.
Puoi usare GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 per il raggruppamento ogni 30 minuti. Naturalmente, la data che ho scelto è solo una data casuale. Puoi scegliere, se lo desideri, la prima (o l'ultima) data nei tuoi dati di esempio.
E puoi anche utilizzare questa tecnica per ottenere ogni intervallo di qualsiasi fascia oraria:basta cambiare la parola chiave MINUTE a qualsiasi parte della data che desideri utilizzare e l'intervallo 30 a qualsiasi intervallo tu voglia.

Considera i seguenti dati di esempio:

;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 ora contiene i seguenti dati:

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

Per ottenere il massimo raggruppato per 30 minuti ti basta questo:

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

Risultati:

interval    max_rn
0           29
1           59
2           60