Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie gruppieren Sie nach einem zeitbasierten Intervall?

Ich denke, Sie verkomplizieren das Ganze zu sehr.
Sie können GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 verwenden zum Gruppieren nach alle 30 Minuten. Natürlich ist das Datum, das ich gewählt habe, nur ein zufälliges Datum. Sie können, wenn Sie möchten, das erste (oder letzte) Datum in Ihren Beispieldaten auswählen.
Und Sie können diese Technik auch verwenden, um jedes Intervall eines beliebigen Zeitabschnitts zu erhalten - ändern Sie einfach das Schlüsselwort MINUTE zu einem beliebigen Datumsteil, den Sie verwenden möchten, und das Intervall 30 zu jedem gewünschten Intervall.

Betrachten Sie die folgenden Beispieldaten:

;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 enthält nun folgende Daten:

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

Um die maximale rn nach 30 Minuten gruppiert zu erhalten, brauchen Sie nur Folgendes:

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

Ergebnisse:

interval    max_rn
0           29
1           59
2           60