どうですか(前のステートメントがセミコロンで終わっていることを確認してください):
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
日のリスト(数値として)とrow_numberがある場合、日を逃すと、これら2つのリスト間のオフセットがわずかに大きくなるという考え方です。そのため、一貫したオフセットを持つ範囲を探しています。
この最後に「ORDERBYNumConsecutiveDaysDESC」を使用するか、しきい値として「HAVING count(*)>14」と言うことができます...
私はこれをテストしていません-頭のてっぺんから書き留めるだけです。うまくいけば、SQL2005以降で動作します。
...そしてtablename(UserID、CreationDate)のインデックスによって非常に助けられます
編集:オフセットは予約語であることが判明したため、代わりにTheOffsetを使用しました。
編集:COUNT(*)を使用するという提案は非常に有効です-私はそもそもそれを行うべきでしたが、実際には考えていませんでした。以前は、代わりにdatediff(day、min(CreationDate)、max(CreationDate))を使用していました。
ロブ