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

SQL Server、任意の値のシーケンスを見つける

    これにより、同じタイプのアクションが2つ以上連続しているすべての顧客が選択されます。

    WITH    rows AS 
            (
            SELECT  customer, action,
                    ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
            FROM    mytable
            )
    SELECT  DISTINCT customer
    FROM    rows rp
    WHERE   EXISTS
            (
            SELECT  NULL
            FROM    rows rl
            WHERE   rl.customer = rp.customer
                    AND rl.rn = rp.rn + 1
                    AND rl.action = rp.action
            )
    

    アクション2だけのより効率的なクエリは次のとおりです :

    WITH    rows AS 
            (
            SELECT  customer, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
            FROM    mytable
            WHERE   action = 2
            )
    SELECT  DISTINCT customer
    FROM    rows rp
    WHERE   EXISTS
            (
            SELECT  NULL
            FROM    rows rl
            WHERE   rl.customer = rp.customer
                    AND rl.rn = rp.rn + 1
            )
    

    更新2:

    中断のない範囲を選択するには:

    WITH    rows AS 
            (
            SELECT  customer, action, lastlogin
                    ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
                    ROW_NUMBER() OVER (PARTITION BY customer, action ORDER BY lastlogin) AS series
            FROM    mytable
            )
    SELECT  DISTINCT customer
    FROM    (
            SELECT  customer
            FROM    rows rp
            WHERE   action
            GROUP BY
                    customer, actioncode, series - rn
            HAVING
                    DETEDIFF(day, MIN(lastlogin), MAX(lastlogin)) >= 14
            ) q
    

    このクエリは2つのシリーズを計算します。1つは連続したORDER BY lastloginを返します 、2番目のパーティションはactionで分割されます さらに:

    action  logindate rn  series diff = rn - series
    1       Jan 01    1   1      0
    1       Jan 02    2   2      0
    2       Jan 03    3   1      2
    2       Jan 04    4   2      2
    1       Jan 05    5   3      2
    1       Jan 06    6   4      2
    

    2つのスキームの違いが同じである限り、シリーズは中断されません。中断するたびにシリーズが中断されます。

    これは、(action, diffの組み合わせを意味します )中断されないグループを定義します。

    action, diffでグループ化できます 、MAXを見つけます およびMIN グループ内でフィルタリングします。

    14を選択する必要がある場合 14ではなく行 連続した日は、COUNT(*)でフィルタリングするだけです DATEDIFFの代わりに 。



    1. OracleデータベースでRAISE_APPLICATION_ERRORメソッドを使用してユーザー定義の例外を宣言する

    2. 挿入スクリプトを作成するSQLスクリプト

    3. SQL句のGROUPBY1はどういう意味ですか?

    4. mysqlクエリからランダムな行を出力します