Hvad med (og sørg venligst for, at den forrige erklæring endte med et 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
Ideen er, at hvis vi har en liste over dagene (som et tal) og et rækkenummer, så vil mistede dage gøre forskydningen mellem disse to lister lidt større. Så vi leder efter en rækkevidde, der har en konsekvent offset.
Du kan bruge "ORDER BY NumConsecutiveDays DESC" i slutningen af dette, eller sige "HAVING count(*)> 14" for en tærskel...
Jeg har dog ikke testet dette - jeg har bare skrevet det fra toppen af mit hoved. Virker forhåbentlig i SQL2005 og videre.
...og ville være meget hjulpet af et indeks på tabelnavn(BrugerID, CreationDate)
Redigeret:Det viser sig, at Offset er et reserveret ord, så jeg brugte TheOffset i stedet.
Redigeret:Forslaget om at bruge COUNT(*) er meget gyldigt - jeg skulle have gjort det i første omgang, men tænkte egentlig ikke. Tidligere brugte den datediff(dag, min(CreationDate), max(CreationDate)) i stedet.
Rob