Wat dacht je van (en zorg ervoor dat de vorige verklaring eindigde met een puntkomma):
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
Het idee is dat als we een lijst met dagen (als een getal) en een rij_nummer hebben, de gemiste dagen de afwijking tussen deze twee lijsten iets groter maken. We zijn dus op zoek naar een bereik met een consistente offset.
U kunt aan het einde hiervan "ORDER BY NumConsecutiveDays DESC" gebruiken, of "HAVING count(*)> 14" zeggen voor een drempel...
Ik heb dit echter niet getest - ik schrijf het gewoon uit mijn hoofd. Hopelijk werkt het in SQL2005 en later.
...en zou zeer geholpen worden door een index op tablename(UserID, CreationDate)
Bewerkt:het blijkt dat Offset een gereserveerd woord is, dus ik heb in plaats daarvan TheOffset gebruikt.
Bewerkt:de suggestie om COUNT(*) te gebruiken is zeer geldig - ik had dat in de eerste plaats moeten doen, maar dacht niet echt na. Voorheen gebruikte het in plaats daarvan datediff(day, min(CreationDate), max(CreationDate)).
Rob