यह थोड़ा मुश्किल है, और ऐसे परिणाम खोजने के लिए जो लगातार बढ़ रहे हैं या घट रहे हैं, आप शायद MATCH_RECOGNIZE
क्लॉज, जिसका MySQL (अभी तक) समर्थन नहीं करता है। इस तरह आप एक पैटर्न को परिभाषित कर सकते हैं जिससे प्रत्येक मात्रा पिछले मान से कम हो। इसके अतिरिक्त, आप शायद इसे एक पुनरावर्ती सीटीई के साथ कर सकते हैं, लेकिन यह मेरी क्षमताओं से बाहर होगा।
यहाँ मैं इस चेतावनी के साथ आया हूँ कि यह केवल पहले और अंतिम मानों की तुलना करता है:
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
सबसे अच्छा समाधान होगा (या आप कुछ रिकर्सन या कस्टम फ़ंक्शन में जोड़ सकते हैं)।