Wie wäre es mit (und stellen Sie bitte sicher, dass die vorherige Anweisung mit einem Semikolon endete):
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
Die Idee ist, dass, wenn wir eine Liste der Tage (als Zahl) und eine row_number haben, dann verpasste Tage den Versatz zwischen diesen beiden Listen etwas größer machen. Also suchen wir nach einem Bereich, der einen konsistenten Offset hat.
Sie könnten am Ende "ORDER BY NumConsecutiveDays DESC" verwenden oder als Schwellenwert "HAVING count(*)> 14" sagen...
Ich habe das aber nicht getestet - ich schreibe es nur von der Spitze meines Kopfes. Funktioniert hoffentlich in SQL2005 und höher.
...und würde sehr durch einen Index auf Tabellenname (UserID, CreationDate) helfen
Bearbeitet:Stellt sich heraus, dass Offset ein reserviertes Wort ist, also habe ich stattdessen TheOffset verwendet.
Bearbeitet:Der Vorschlag, COUNT(*) zu verwenden, ist sehr gültig - ich hätte das zuerst tun sollen, habe aber nicht wirklich nachgedacht. Zuvor wurde stattdessen datediff(day, min(CreationDate), max(CreationDate)) verwendet.
Rob