sql >> データベース >  >> RDS >> Sqlserver

アクセスの最小連続日数を決定するSQL?

    どうですか(前のステートメントがセミコロンで終わっていることを確認してください):

    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))を使用していました。

    ロブ



    1. 文字列を格納するためにデータ型テキストを使用することの欠点はありますか?

    2. postgresql:psqlを実行するときに-h localhostを指定する必要があるのはなぜですか?

    3. PostgreSQL + Rails citext

    4. PostgreSQL2つの日時/タイムスタンプの間でランダムな日時/タイムスタンプを取得します