Co powiesz na to (i upewnij się, że poprzednie stwierdzenie zakończyło się średnikiem):
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
Chodzi o to, że jeśli mamy listę dni (jako liczbę) i numer_wiersza, to pominięte dni sprawiają, że przesunięcie między tymi dwiema listami jest nieco większe. Dlatego szukamy zakresu, który ma spójne przesunięcie.
Możesz użyć „ORDER BY NumConsecutiveDays DESC” na końcu tego lub powiedzieć „HAVING count(*)> 14” jako próg...
Nie testowałem tego jednak - po prostu spisywałem to z czubka głowy. Mam nadzieję, że działa w SQL2005 i później.
...i bardzo pomógłby indeks na tablename (UserID, CreationDate)
Edytowane:Okazuje się, że Offset jest słowem zastrzeżonym, więc zamiast tego użyłem TheOffset.
Edytowane:Sugestia użycia COUNT(*) jest bardzo słuszna - powinienem był to zrobić, ale tak naprawdę nie myślałem. Wcześniej używał datediff(dzień, min(CreationDate), max(CreationDate)) zamiast tego.
Okraść