अपडेट किए गए प्रश्न का उत्तर
SELECT *
FROM (
SELECT *
,lag(val, 1, 0) OVER (PARTITION BY status ORDER BY id) last_val
,lag(status) OVER (PARTITION BY val ORDER BY id) last_status
FROM t1
) x
WHERE status = 1
AND (last_val <> val OR last_status = 0)
कैसे?
पहले की तरह ही, लेकिन इस बार दो विंडो फ़ंक्शंस को मिलाएं। डिवाइस पर स्विच करना तभी योग्य होता है जब ..
1. पिछला स्विच ऑन किया गया एक भिन्न था एक।
2. या उसी डिवाइस को बंद स्विच कर दिया गया है इसकी अंतिम प्रविष्टि में। NULL
with के साथ कॉर्नर केस विभाजन की पहली पंक्ति के लिए अप्रासंगिक है, क्योंकि तब पंक्ति पहले से ही 1. . में योग्य है
प्रश्न के मूल संस्करण का उत्तर दें।
यदि आपका मैं आपके कार्य को सही ढंग से समझता हूं, तो यह सरल प्रश्न काम करता है:
SELECT *
FROM (
SELECT *
,lag(val, 1, 0) OVER (ORDER BY id) last_on
FROM t1
WHERE status = 1
) x
WHERE last_on <> val
अनुरोध के अनुसार पंक्ति 1, 3, 6, 7 लौटाता है।
कैसे?
सबक्वेरी आपके विवरण के अनुसार, सभी स्विचिंग को अनदेखा कर देती है, क्योंकि यह सिर्फ शोर है। उन प्रविष्टियों को छोड़ देता है जहां एक उपकरण चालू होता है। उनमें से, केवल वे प्रविष्टियाँ अयोग्य हैं, जहाँ एक ही उपकरण पहले से चालू था (अंतिम प्रविष्टि स्विचिंग चालू)। विंडो फ़ंक्शन lag()
उस के लिए। विशेष रूप से मैं 0
. प्रदान करता हूं पहली पंक्ति के विशेष मामले को कवर करने के लिए डिफ़ॉल्ट के रूप में - यह मानते हुए कि val = 0
के साथ कोई उपकरण नहीं है .
अगर है, तो दूसरी असंभव संख्या चुनें।
यदि कोई संख्या असंभव नहीं है, तो विशेष मामले को NULL
के रूप में छोड़ दें lag(val) OVER ...
. के साथ और बाहरी क्वेरी में इसके साथ जांचें:
WHERE last_on IS DISTINCT FROM val