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