Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Xác định người dùng với SQL có xu hướng giảm

Điều này hơi phức tạp và để tìm kết quả tăng hoặc giảm đều đặn, bạn có thể muốn sử dụng MATCH_RECOGNIZE mà MySQL không (chưa) hỗ trợ. Bằng cách này, bạn có thể xác định một mẫu theo đó mỗi qty nhỏ hơn giá trị trước đó. Ngoài ra, bạn có thể làm điều này với cte đệ quy, nhưng điều đó nằm ngoài khả năng của tôi.

Đây là những gì tôi nghĩ ra, với lưu ý rằng nó chỉ so sánh giá trị đầu tiên và giá trị cuối cùng:

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)

Điều này mang lại:

CUSTOMER
Bob
Mary

Hoặc, để giảm nghiêm ngặt với mức tối đa đã biết, bạn có thể liên kết tất cả chúng lại với nhau, điều này khá xấu:

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

Điều này mang lại:

CUSTOMER
Mary

Mặc dù với một số tiền không xác định, tôi nghĩ match_recognize sẽ là giải pháp tốt nhất (hoặc bạn có thể thêm một số đệ quy hoặc một hàm tùy chỉnh).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php không lưu dữ liệu vào mysql

  2. Kế thừa lớp với .NET EF4.1 + MySQL

  3. Làm thế nào để viết một truy vấn MYSQL sẽ trả về các phần tử con được lồng vào bên dưới các bậc cha mẹ?

  4. Làm thế nào để đảo ngược thứ tự của các ký tự trong một chuỗi trong MySQL

  5. Lưu dữ liệu JSON lồng nhau vào cơ sở dữ liệu MySQL bằng Hibernate