sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo se agrupa por cualquier intervalo basado en el tiempo?

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