Co takhle (a ujistěte se, že předchozí příkaz končil středníkem):
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
Myšlenka je taková, že pokud máme seznam dnů (jako číslo) a row_number, pak zmeškané dny dělají posun mezi těmito dvěma seznamy o něco větší. Takže hledáme rozsah, který má konzistentní offset.
Můžete použít "ORDER BY NumConsecutiveDays DESC" na konci tohoto, nebo říci "HAVING count(*)> 14" pro prahovou hodnotu...
To jsem ale netestoval - jen to píšu z hlavy. Doufejme, že funguje v SQL2005 a dále.
...a velmi by nám pomohl index na tablename(UserID, CreationDate)
Upraveno:Ukázalo se, že Offset je vyhrazené slovo, takže jsem místo toho použil TheOffset.
Upraveno:Návrh použít COUNT(*) je velmi platný - měl jsem to udělat na prvním místě, ale ve skutečnosti jsem nepřemýšlel. Dříve se místo toho používal datediff(den, min(Datum vytvoření), max(Datum vytvoření)).
Rob