Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak grupujesz według dowolnego przedziału czasowego?

Myślę, że zbytnio komplikujesz sprawy.
Możesz użyć GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 za grupowanie co 30 minut. Oczywiście wybrana przeze mnie data jest przypadkowa. Możesz wybrać, jeśli chcesz, pierwszą (lub ostatnią) datę w przykładowych danych.
Możesz również użyć tej techniki, aby uzyskać każdy interwał z dowolnej części czasu - po prostu zmień słowo kluczowe MINUTE do dowolnej części daty, której chcesz użyć, oraz przedziału 30 w dowolnym przedziale.

Rozważ następujące przykładowe dane:

;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 teraz zawiera następujące dane:

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

Aby uzyskać maksymalny rn pogrupowany według 30 minut, potrzebujesz tylko tego:

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

Wyniki:

interval    max_rn
0           29
1           59
2           60



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server (2008) Przekaż ArrayList lub String do SP dla IN()

  2. Różnica między transakcją niejawną a jawną

  3. Proste zapytanie w celu uzyskania maksymalnej wartości dla każdego identyfikatora

  4. Jakie mechanizmy szyfrowania oferuje SQL Server 2008 Standard?

  5. Msg 102, Poziom 15, Stan 1, Wiersz 1 Nieprawidłowa składnia w pobliżu „ ”