डिफ़ॉल्ट RANGE / ROWS
FIRST_VALUE
. के लिए (किसी भी अन्य विश्लेषणात्मक कार्य के लिए) BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
है ।
अगर आप IGNORE NULLS
जोड़ते हैं , फिर NULL
रेंज बनाते समय मूल्यों को ध्यान में नहीं रखा जाता है।
RANGE
न्यूल पंक्तियों को छोड़कर BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
(यह मान्य नहीं है OVER
खंड)।
चूंकि आपका txt
वे हैं जो NULL
हैं उच्च id
है हैं, उन्हें पहले चुना जाता है, और उनकी श्रेणियां खाली हैं, क्योंकि कोई गैर-NULL
नहीं है उनके और UNBOUNDED PRECEDING
. के बीच की पंक्तियाँ
आपको या तो ORDER BY
बदलना चाहिए या RANGE
आपकी क्वेरी का खंड।
ORDER BY
. बदल रहा है पंक्तियों को NULL
. के साथ रखता है आईडी खिड़की के अंत में है ताकि एक गैर-NULL
मान (यदि कोई हो) हमेशा पहले चुना जाएगा, और RANGE
निश्चित रूप से उस मान से प्रारंभ होगा:
with t
as (
select 450 id, null txt , 3488 id_usr from dual union all
select 449 , null , 3488 from dual union all
select 79 , 'A' , 3488 from dual union all
select 78 , 'X' , 3488 from dual
)
select id
, txt
, id_usr
, first_value(txt) over (partition by id_usr order by NVL2(TXT, NULL, id) DESC) first_one
from t
RANGE
बदल रहा है सभी गैर-NULL
. को शामिल करने के लिए श्रेणी को फिर से परिभाषित करता है विभाजन में पंक्तियाँ:
with t
as (
select 450 id, null txt , 3488 id_usr from dual union all
select 449 , null , 3488 from dual union all
select 79 , 'A' , 3488 from dual union all
select 78 , 'X' , 3488 from dual
)
select id
, txt
, id_usr
, first_value(txt IGNORE NULLS) over (partition by id_usr order by id DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_one
from t