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

SQL सर्वर, मानों का एक मनमाना क्रम खोजें

यह एक ही प्रकार की कम से कम दो लगातार कार्रवाइयों वाले सभी ग्राहकों का चयन करेगा।

WITH    rows AS 
        (
        SELECT  customer, action,
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
                AND rl.action = rp.action
        )

यहाँ केवल क्रिया के लिए अधिक कुशल क्वेरी है 2 :

WITH    rows AS 
        (
        SELECT  customer, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        WHERE   action = 2
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
        )

अपडेट 2:

अबाधित श्रेणियों का चयन करने के लिए:

WITH    rows AS 
        (
        SELECT  customer, action, lastlogin
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
                ROW_NUMBER() OVER (PARTITION BY customer, action ORDER BY lastlogin) AS series
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    (
        SELECT  customer
        FROM    rows rp
        WHERE   action
        GROUP BY
                customer, actioncode, series - rn
        HAVING
                DETEDIFF(day, MIN(lastlogin), MAX(lastlogin)) >= 14
        ) q

यह क्वेरी दो शृंखलाओं की गणना करती है:एक सन्निहित ORDER BY lastlogin returns देता है , दूसरा एक विभाजन action . द्वारा इसके अतिरिक्त:

action  logindate rn  series diff = rn - series
1       Jan 01    1   1      0
1       Jan 02    2   2      0
2       Jan 03    3   1      2
2       Jan 04    4   2      2
1       Jan 05    5   3      2
1       Jan 06    6   4      2

जब तक दो योजनाओं के बीच का अंतर समान है, तब तक श्रृंखला निर्बाध है। प्रत्येक रुकावट श्रृंखला को तोड़ देती है।

इसका मतलब है कि (action, diff . का संयोजन ) अबाधित समूहों को परिभाषित करता है।

हम action, diff . के आधार पर समूह बना सकते हैं , MAX find ढूंढें और MIN समूहों के भीतर और उन पर फ़िल्टर करें।

अगर आपको 14 . को चुनना है पंक्तियों के बजाय 14 लगातार दिन, बस COUNT(*) . पर फ़िल्टर करें DATEDIFF . के बजाय ।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर (T-SQL) में एक विभाजन को स्विच-आउट करें

  2. सभी तालिकाओं की स्कीमा खोजने के लिए SQL क्वेरी

  3. SQL सर्वर 2008 में एकाधिक कॉलम में COUNT(DISTINCT)

  4. SQL सर्वर प्राथमिक कुंजी के बिना संकुल अनुक्रमणिका के साथ तालिका बना रहा है

  5. SQL सर्वर 2008 में दूसरे डेटाबेस के मानों के साथ एक डेटाबेस में अद्यतन रिकॉर्ड?