sql >> Database >  >> RDS >> Sqlserver

Hoe groepeert u op elk op tijd gebaseerd interval?

Ik denk dat je het te ingewikkeld maakt.
Je kunt GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 gebruiken om elke 30 minuten te groeperen. Natuurlijk is de datum die ik heb gekozen een willekeurige datum. U kunt, als u wilt, de eerste (of laatste) datum in uw voorbeeldgegevens kiezen.
En u kunt deze techniek ook gebruiken om elk interval van elk tijdsdeel te krijgen - verander gewoon het trefwoord MINUTE naar elk datumgedeelte dat u wilt gebruiken, en de intreval 30 naar elk gewenst interval.

Bekijk de volgende voorbeeldgegevens:

;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 bevat nu de volgende gegevens:

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

Om de maximale rn gegroepeerd op 30 minuten te krijgen, heb je dit nodig:

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

Resultaten:

interval    max_rn
0           29
1           59
2           60



  1. Prestatie-implicaties van het toestaan ​​van het gebruik van een alias in de HAVING-clausule

  2. Dus wat IS de beste manier om te controleren of een rij bestaat? BESTAAT, COUNT of num_rows?

  3. Hoe kan ik gegevens van de ene tabel naar de andere verplaatsen bij railsmigratie?

  4. Groottelimiet voor MySQL VARCHAR