यह एक ही प्रकार की कम से कम दो लगातार कार्रवाइयों वाले सभी ग्राहकों का चयन करेगा।
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
. के बजाय ।