sql >> Databasteknik >  >> RDS >> Sqlserver

Hur grupperar du efter något tidsbaserat intervall?

Jag tror att du har överkomplicerat tunnningarna.
Du kan använda GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 för gruppering efter var 30:e minut. Självklart är det datum jag har valt bara ett slumpmässigt datum. Du kan välja, om du vill, det första (eller sista) datumet i dina exempeldata.
Och du kan också använda den här tekniken för att få alla intervaller i en tidsdel - ändra bara nyckelordet MINUT till valfri datumdel du vill använda, och intervallet 30 till vilket intervall du vill.

Tänk på följande exempeldata:

;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 innehåller nu följande data:

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

För att få den maximala rn grupperad med 30 minuter behöver du bara detta:

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

Resultat:

interval    max_rn
0           29
1           59
2           60



  1. kan inte kontrollera att användarnamnet finns eller inte

  2. Hur man använder en eller flera OR och AND i mysql-fråga

  3. gruppera efter månadsnamn i sql

  4. Köra ett SSIS-paket med dtexec