Výchozí RANGE / ROWS
pro FIRST_VALUE
(stejně jako u jakékoli jiné analytické funkce) je BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.
Pokud přidáte IGNORE NULLS
a poté NULL
hodnoty se při vytváření rozsahu neberou v úvahu.
RANGE
se změní na BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS
(není to platný OVER
doložka).
Od vašeho txt
's, které jsou NULL
mají vysoké id
's, jsou vybrány jako první a jejich rozsahy jsou prázdné, protože nejsou žádné jiné než NULL
řádků mezi nimi a UNBOUNDED PRECEDING
Měli byste změnit buď ORDER BY
nebo RANGE
klauzule vašeho dotazu.
Změna ORDER BY
vloží řádky s NULL
id je na konci okna, takže není NULL
hodnota (pokud existuje) bude vždy vybrána jako první a RANGE
bude zaručeně začínat od této hodnoty:
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
Změna RANGE
předefinuje rozsah tak, aby zahrnoval všechny jiné než NULL
řádků v oddílu:
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