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

下降傾向のSQLでユーザーを特定する

    これは少し注意が必要です。着実に増加または減少している結果を見つけるには、おそらく MATCH_RECOGNIZE MySQLが(まだ)サポートしていない句。このようにして、各数量が前の値よりも少なくなるパターンを定義できます。さらに、再帰cteを使用してこれを行うこともできますが、それは私の能力の範囲外です。

    これが私が思いついたものですが、最初と最後の値のみを比較するという警告があります:

    WITH
        tbl (customer, purchasedate, quantity) AS (
    SELECT * FROM VALUES 
        ('Bob',         '9/1/2021',        10),
        ('Bob',         '9/10/2021',       6),
        ('Bob',         '9/18/2021',       5),
        ('Bob',         '9/19/2021',       8),
        ('Mary',        '9/1/2021',        10),
        ('Mary',        '9/10/2021',       6),
        ('Mary',        '9/18/2021',       5),
        ('Mary',        '9/19/2021',       3),
        ('Frank',       '9/1/2021',        5),
        ('Lucus',       '9/1/2021',        5),
        ('Lucus',       '9/10/2021',       6),
        ('Lucus',       '9/18/2021',       10)
    )
    
    SELECT
        DISTINCT customer
    FROM
        tbl
    QUALIFY
          FIRST_VALUE(quantity) OVER (partition BY customer ORDER BY purchasedate)
        > LAST_VALUE(quantity)  OVER (PARTITION BY customer ORDER BY purchasedate)
    

    与えるもの:

    CUSTOMER
    Bob
    Mary
    

    または、既知の最大値で厳密に減少させるには、それらをすべて連鎖させて、かなり醜くすることができます:

    WITH
        tbl (customer, purchasedate, quantity) AS (
    SELECT * FROM VALUES 
        ('Bob',         '9/1/2021',        10),
        ('Bob',         '9/10/2021',       6),
        ('Bob',         '9/18/2021',       5),
        ('Bob',         '9/19/2021',       8),
        ('Mary',        '9/1/2021',        10),
        ('Mary',        '9/10/2021',       6),
        ('Mary',        '9/18/2021',       5),
        ('Mary',        '9/19/2021',       3),
        ('Frank',       '9/1/2021',        5),
        ('Lucus',       '9/1/2021',        5),
        ('Lucus',       '9/10/2021',       6),
        ('Lucus',       '9/18/2021',       10)
    )
    
    SELECT
        DISTINCT customer
    FROM
        tbl
        qualify 
            (NTH_VALUE(quantity, 1) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 2) OVER (partition BY customer ORDER BY purchasedate))
            and ((NTH_VALUE(quantity, 2) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 3) OVER (partition BY customer ORDER BY purchasedate)) or (NTH_VALUE(quantity, 3) OVER (partition BY customer ORDER BY purchasedate) is null))
            and ((NTH_VALUE(quantity,3) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 4) OVER (partition BY customer ORDER BY purchasedate)) or (NTH_VALUE(quantity, 4) OVER (partition BY customer ORDER BY purchasedate) is null))
    

    与えるもの:

    CUSTOMER
    Mary
    

    金額は不明ですが、match_recognizeだと思います 最善の解決策になります(または、再帰やカスタム関数を追加することもできます)。



    1. RailsPostgresのJSONBデータ型のwhereクエリを使用する

    2. pg_restoreは既存のテーブルを上書きしますか?

    3. Dapper-Oracleschema.package.functionを呼び出します

    4. LocalTime()がPostgreSQLでどのように機能するか