Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengidentifikasi pengguna dengan SQL tren menurun

Ini agak rumit, dan untuk menemukan hasil yang terus meningkat atau menurun, Anda mungkin ingin menggunakan MATCH_RECOGNIZE klausa, yang tidak (belum) didukung oleh MySQL. Dengan cara ini Anda dapat menentukan pola di mana setiap qty lebih kecil dari nilai sebelumnya. Selain itu, Anda mungkin bisa melakukan ini dengan cte rekursif, tapi itu di luar kemampuan saya.

Inilah yang saya buat, dengan peringatan bahwa itu hanya membandingkan nilai pertama dan terakhir:

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)

Yang memberikan:

CUSTOMER
Bob
Mary

Atau, untuk benar-benar menurun dengan maks yang diketahui, Anda dapat menggabungkan semuanya menjadi sangat jelek:

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))

Yang memberikan:

CUSTOMER
Mary

Meskipun untuk jumlah yang tidak diketahui saya akan berpikir match_recognize akan menjadi solusi terbaik (atau Anda dapat menambahkan beberapa rekursi atau fungsi khusus).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Simpan nama fungsi dalam database dan kemudian jalankan

  2. Bersarang dalam model Nest Json ke Tabel SQL

  3. Mengirim kata sandi melalui web

  4. Python:karakter format yang tidak didukung ''' (0x27) pada indeks 350

  5. MySQL - mysqldump --rutin hanya mengekspor 1 prosedur tersimpan (berdasarkan nama) dan tidak setiap rutin