Creo que estás complicando demasiado las cosas.
Puedes usar GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
para agrupar por cada 30 minutos. Por supuesto, la fecha que he elegido es solo una fecha aleatoria. Puede elegir, si lo desea, la primera (o la última) fecha en sus datos de muestra.
Y también puede usar esta técnica para obtener todos los intervalos de cualquier parte de tiempo; simplemente cambie la palabra clave MINUTE
a cualquier parte de la fecha que desee usar, y el intervalo 30
a cualquier intervalo que desee.
Considere los siguientes datos de muestra:
;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
ahora contiene los siguientes datos:
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
Para obtener el rn máximo agrupado por 30 minutos solo necesitas esto:
SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30
Resultados:
interval max_rn
0 29
1 59
2 60