Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana Anda mengelompokkan berdasarkan interval waktu?

Saya pikir Anda terlalu memperumit masalah.
Anda dapat menggunakan GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 untuk pengelompokan setiap 30 menit. Tentu saja, tanggal yang saya pilih hanyalah tanggal acak. Anda dapat memilih, jika Anda mau, tanggal pertama (atau terakhir) dalam data sampel Anda.
Dan Anda juga dapat menggunakan teknik ini untuk mendapatkan setiap interval dari setiap bagian waktu - cukup ubah kata kunci MINUTE ke bagian tanggal mana pun yang ingin Anda gunakan, dan intreval 30 ke interval yang Anda inginkan.

Perhatikan contoh data berikut:

;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 sekarang berisi data berikut:

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

Untuk mendapatkan rn maksimum yang dikelompokkan berdasarkan 30 menit, Anda hanya perlu ini:

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

Hasil:

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. Menambahkan kolom dengan kunci utama di tabel yang ada

  2. Kesalahan fatal PHP:Panggilan ke fungsi yang tidak ditentukan mssql_query ()

  3. Apa pro dan kontra untuk menjaga SQL di Stored Procs versus Code

  4. Bagaimana melakukan pembaruan tabel Sql Server CE dari tabel lain

  5. T-SQL cara mengubah nilai sebelum memasukkan