Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

नीचे की ओर रुझान वाले उपयोगकर्ताओं की पहचान करना SQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में स्थिति निष्पादन का क्रम

  2. PHPMailer दोहरा ईमेल भेज रहा है

  3. MySQL के क्वेरी प्लानर में कोई आंकड़े मामले के लिए यह रिकॉर्ड/फैनआउट तर्क कैसे प्राप्त किया गया था?

  4. स्प्रिंग डेटा क्वेरी काम नहीं कर रही है जब क्वेरी पैरामीटर एक इकाई है

  5. MySQL में विभाजन से अधिक रैंक कैसे करें