Que tal (e certifique-se de que a declaração anterior terminou com um ponto e vírgula):
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
A ideia é que, se tivermos uma lista dos dias (como um número) e um número_linha, os dias perdidos tornam o deslocamento entre essas duas listas um pouco maior. Então, estamos procurando um intervalo que tenha um deslocamento consistente.
Você pode usar "ORDER BY NumConsecutiveDays DESC" no final disso, ou dizer "HAVING count(*)> 14" para um limite...
Eu não testei isso, porém - apenas escrevendo em cima da minha cabeça. Espero que funcione no SQL2005 e em diante.
... e seria muito ajudado por um índice em tablename (UserID, CreationDate)
Editado:Acontece que Offset é uma palavra reservada, então usei TheOffset.
Editado:A sugestão de usar COUNT(*) é muito válida - eu deveria ter feito isso em primeiro lugar, mas não estava realmente pensando. Anteriormente, estava usando dateiff(day, min(CreationDate), max(CreationDate)).
Roubar