Que diriez-vous (et assurez-vous que la déclaration précédente se termine par un point-virgule) :
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
L'idée étant que si nous avons la liste des jours (sous forme de nombre) et un row_number, les jours manqués augmentent légèrement le décalage entre ces deux listes. Nous recherchons donc une plage qui a un décalage cohérent.
Vous pouvez utiliser "ORDER BY NumConsecutiveDays DESC" à la fin, ou dire "HAVING count(*)> 14" pour un seuil...
Je n'ai pas testé cela cependant - je l'écris simplement du haut de ma tête. Espérons que cela fonctionne dans SQL2005 et sur.
...et serait très aidé par un index sur tablename(UserID, CreationDate)
Modifié :il s'avère que Offset est un mot réservé, j'ai donc utilisé TheOffset à la place.
Edité :la suggestion d'utiliser COUNT (*) est très valable - j'aurais dû le faire en premier lieu, mais je n'y pensais pas vraiment. Auparavant, il utilisait datediff(day, min(CreationDate), max(CreationDate)) à la place.
Rob