डिफ़ॉल्ट 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