Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como você agrupa por qualquer intervalo baseado em tempo?


Acho que você está complicando demais.
Você pode usar GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 para agrupamento a cada 30 minutos. Claro, a data que eu escolhi é apenas uma data aleatória. Você pode escolher, se quiser, a primeira (ou última) data em seus dados de amostra.
E você também pode usar essa técnica para obter todos os intervalos de qualquer parte do tempo - basta alterar a palavra-chave MINUTE para qualquer parte da data que você deseja usar, e o intervalo 30 para qualquer intervalo que você quiser.

Considere os seguintes dados de exemplo:
;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 agora contém os seguintes dados:
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 obter o rn máximo agrupado por 30 minutos, você só precisa disso:
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