Какво ще кажете (и моля, уверете се, че предишният израз завършва с точка и запетая):
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
Идеята е, че ако имаме списък с дните (като число) и номер на ред, тогава пропуснатите дни правят отместването между тези два списъка малко по-голямо. Така че търсим диапазон, който има последователно отместване.
Можете да използвате „ORDER BY NumConsecutiveDays DESC“ в края на това или да кажете „HAVING count(*)> 14“ за праг...
Не съм тествал това обаче - просто го написах от главата си. Надяваме се, че работи в SQL2005 и след него.
... и ще бъде много подпомогнато от индекс на tablename(UserID, CreationDate)
Редактирано:Оказа се, че Offset е запазена дума, така че вместо това използвах TheOffset.
Редактирано:Предложението да се използва COUNT(*) е много валидно - трябваше да го направя на първо място, но не мислех наистина. Преди това използваше datediff(day, min(CreationDate), max(CreationDate)) вместо това.
Роб