Jeg tror, du har overkompliceret tyndere.
Du kan bruge GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
til gruppering efter hvert 30. minut. Selvfølgelig er den dato, jeg har valgt, kun en tilfældig dato. Du kan vælge, hvis du vil, den første (eller sidste) dato i dine eksempeldata.
Og du kan også bruge denne teknik til at få hvert interval af en hvilken som helst tidsdel - bare skift søgeordet MINUTE til enhver datodel, du vil bruge, og intervallet
30
til ethvert interval, du ønsker.
Overvej følgende eksempeldata:
;WITH CTE AS ( SELECT CAST('2017-01-01T00:00:00' som datetime) Som TheDateTime, 0 som rn UNION ALL SELECT DATEADD(MINUT, 1, TheDateTime), rn + 1 FROM CTE WHERE rn <60)VÆLG TheDateTime, rn INTO #TFROM CTEOPTION(MAXRECURSION 0)
#T
indeholder nu følgende data:
TheDateTime rn2017-01-01 00:00:00.000 02017-01-01 00:01:00.000 12017-01-01 00:02:00.000 22017-01-03:00:3. .2017-01-01 00:59:00.000 592017-01-01 01:00:00.000 60
For at få det maksimale rn grupperet efter 30 minutter skal du bare bruge dette:
VÆLG DATODIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)FROM #TGROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Resultater:
interval max_rn0 291 592 60