Che ne dici (e assicurati che l'istruzione precedente finisse con un punto e virgola):
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
L'idea è che se abbiamo un elenco dei giorni (come numero) e un numero_riga, i giorni persi aumentano leggermente l'offset tra questi due elenchi. Quindi stiamo cercando un intervallo che abbia un offset coerente.
Puoi usare "ORDER BY NumConsecutiveDays DESC" alla fine di questo, o dire "HAVING count(*)> 14" per una soglia...
Non l'ho testato però, l'ho solo scritto dalla parte superiore della mia testa. Si spera che funzioni in SQL2005 e oltre.
...e sarebbe molto aiutato da un indice su tablename(UserID, CreationDate)
Modificato:risulta che Offset è una parola riservata, quindi ho usato TheOffset invece.
Modificato:il suggerimento di utilizzare COUNT(*) è molto valido:avrei dovuto farlo in primo luogo ma non stavo davvero pensando. In precedenza utilizzava datediff(day, min(CreationDate), max(CreationDate)).
Rob