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