Vad sägs om (och se till att föregående påstående slutade med semikolon):
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
Tanken är att om vi har en lista över dagar (som ett nummer) och ett radnummer, så gör missade dagar förskjutningen mellan dessa två listor något större. Så vi letar efter ett intervall som har en konsekvent offset.
Du kan använda "ORDER BY NumConsecutiveDays DESC" i slutet av detta, eller säga "HAVING count(*)> 14" för en tröskel...
Jag har dock inte testat det här - jag har bara skrivit av det på huvudet. Fungerar förhoppningsvis i SQL2005 och vidare.
...och skulle vara mycket hjälpt av ett index på tabellnamn(användar-ID, skapandedatum)
Redigerat:Det visade sig att Offset är ett reserverat ord, så jag använde TheOffset istället.
Redigerat:Förslaget att använda COUNT(*) är mycket giltigt - jag borde ha gjort det från början men tänkte inte riktigt. Tidigare använde den datediff(day, min(CreationDate), max(CreationDate)) istället.
Rob