sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan grupperer du efter et tidsbaseret interval?

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 



  1. Oracle:Hvad betyder 'udfør øjeblikkeligt'?

  2. Grupperet sammenkædning i SQL Server

  3. Sådan genereres dynamisk MYSQL UPDATE-sætning baseret på definerede variabler fra HTML FORM

  4. Hvordan sammenligner man bedst med 0 i PHP?