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

SQL untuk menentukan hari akses minimum berurutan?

Bagaimana dengan (dan pastikan pernyataan sebelumnya diakhiri dengan titik koma):

WITH numberedrows
     AS (SELECT ROW_NUMBER() OVER (PARTITION BY UserID 
                                       ORDER BY CreationDate)
                - DATEDIFF(day,'19000101',CreationDate) AS TheOffset,
                CreationDate,
                UserID
         FROM   tablename)
SELECT MIN(CreationDate),
       MAX(CreationDate),
       COUNT(*) AS NumConsecutiveDays,
       UserID
FROM   numberedrows
GROUP  BY UserID,
          TheOffset  

Idenya adalah jika kita memiliki daftar hari (sebagai angka), dan row_number, maka hari yang terlewat membuat offset antara dua daftar ini sedikit lebih besar. Jadi kami mencari rentang yang memiliki offset yang konsisten.

Anda dapat menggunakan "ORDER BY NumConsecutiveDays DESC" di akhir ini, atau ucapkan "HAVING count(*)> 14" untuk ambang...

Saya belum menguji ini - hanya menuliskannya di atas kepala saya. Semoga bekerja di SQL2005 dan seterusnya.

...dan akan sangat terbantu oleh indeks pada tablename(UserID, CreationDate)

Diedit:Ternyata Offset adalah kata yang dicadangkan, jadi saya menggunakan TheOffset sebagai gantinya.

Diedit:Saran untuk menggunakan COUNT(*) sangat valid - Saya seharusnya melakukannya sejak awal tetapi tidak benar-benar berpikir. Sebelumnya menggunakan dateiff(day, min(CreationDate), max(CreationDate)) sebagai gantinya.

Rob



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara paling efisien di SQL Server untuk mendapatkan tanggal dari tanggal + waktu?

  2. Bagaimana cara mengambil nilai peningkatan otomatis terakhir di MS-Access seperti @@Identity di Sql Server

  3. Menjatuhkan batasan tanpa nama

  4. konversi tipe data varchar ke tipe data datetime menghasilkan nilai di luar rentang

  5. Klausul Output SQL Server menjadi variabel skalar