विश्लेषणात्मक के साथ मैं इसे इस तरह से करूंगा:
SELECT id, val
FROM ( SELECT id, val
,LAG(val) OVER (ORDER BY id) AS prev_val
FROM p ) x
WHERE val <> COALESCE(prev_val, val)
ORDER BY id
अपडेट करें (कुछ स्पष्टीकरण):
विश्लेषणात्मक कार्य प्रसंस्करण के बाद के चरण के रूप में कार्य करते हैं। क्वेरी परिणाम को समूहों में विभाजित किया गया है (partition by
) और विश्लेषणात्मक कार्य समूह के संदर्भ में लागू किया जाता है।
इस मामले में, क्वेरी p
. से एक चयन है . लागू किया जा रहा विश्लेषणात्मक कार्य LAG
. है . चूंकि कोई partition by
नहीं है खंड, केवल एक समूहीकरण है:संपूर्ण परिणाम सेट। यह समूहीकरण id
. द्वारा आदेशित किया गया है . LAG
निर्दिष्ट क्रम का उपयोग करके समूहीकरण में पिछली पंक्ति का मान लौटाता है। परिणाम प्रत्येक पंक्ति में एक अतिरिक्त कॉलम (उपनाम prev_val) है जो val
है पिछली पंक्ति के। वह सबक्वेरी है।
फिर हम उन पंक्तियों की तलाश करते हैं जहां val
val
. से मेल नहीं खाता पिछली पंक्ति (prev_val) की। COALESCE
पहली पंक्ति के विशेष मामले को संभालता है जिसका कोई पिछला मान नहीं है।
विश्लेषणात्मक कार्य पहली बार में थोड़ा अजीब लग सकता है, लेकिन विश्लेषणात्मक कार्यों की खोज में बहुत सारे उदाहरण मिलते हैं कि वे कैसे काम करते हैं। उदाहरण के लिए:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm बस याद रखें कि यह एक पोस्ट-प्रोसेसिंग चरण है। जब तक आप इसे सबक्वायरी नहीं करते तब तक आप विश्लेषणात्मक फ़ंक्शन के मूल्य पर फ़िल्टरिंग आदि नहीं कर पाएंगे।