LAST_VALUE()
के साथ समस्या यह है कि विंडोिंग क्लॉज़ के लिए डिफ़ॉल्ट नियम उन मानों को हटा देते हैं जो आप वास्तव में चाहते हैं। यह एक बहुत ही सूक्ष्म समस्या है और इस कार्यक्षमता का समर्थन करने वाले सभी डेटाबेस में सच है।
यह Oracle ब्लॉग से आता है:
<ब्लॉककोट>जबकि हम विंडोिंग क्लॉज के विषय पर हैं, फर्स्ट और लास्ट फंक्शन के लिए निहित और अपरिवर्तनीय विंडो क्लॉज अनबाउंडेड प्रीसीडिंग और अनबाउंडेड फॉलोइंग के बीच है, दूसरे शब्दों में हमारे विभाजन में सभी पंक्तियों में। FIRST_VALUE और LAST_VALUE के लिए डिफ़ॉल्ट लेकिन परिवर्तनशील विंडोिंग क्लॉज अनबाउंडेड PRECEDINGAND CURRENT ROW के बीच ROWS है, दूसरे शब्दों में हम वर्तमान के बाद पंक्तियों को बाहर कर देते हैं। जब हम सूची में पहली पंक्ति की तलाश कर रहे होते हैं तो किसी सूची के नीचे से पंक्तियों को छोड़ने से कोई फर्क नहीं पड़ता है ( FIRST_VALUE) लेकिन जब हम सूची में अंतिम पंक्ति (LAST_VALUE) की तलाश कर रहे हैं तो यह महत्व देता है इसलिए आपको आमतौर पर LAST_VALUE का उपयोग करते समय स्पष्ट रूप से पंक्तियों के बीच पंक्तियों को निर्दिष्ट करने की आवश्यकता होगी और अनबाउंडेड फॉलोइंग स्पष्ट रूप से या केवल FIRST_VALUE का उपयोग करें और सॉर्ट ऑर्डर को उलट दें .
इसलिए, बस FIRST_VALUE()
use का उपयोग करें . यह वही करता है जो आप चाहते हैं:
with test (id, session_ID, value) as (
(VALUES (0, 2, 100),
(1, 2, 120),
(2, 2, 140),
(3, 1, 900),
(4, 1, 800),
(5, 1, 500)
)
)
select id,
first_value(value) over (partition by session_ID order by id) as first_value_window,
first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
from test
order by id