Standard RANGE / ROWS
for FIRST_VALUE
(som for enhver anden analytisk funktion) er BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
.
Hvis du tilføjer IGNORE NULLS
, derefter NULL
værdier tages ikke i betragtning, når intervallet opbygges.
RANGE
bliver BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS
(det er ikke en gyldig OVER
klausul).
Siden din txt
's, der er NULL
har et højt id
's, vælges de først, og deres områder er tomme, da der ikke er nogen ikke-NULL
rækker mellem dem og UNBOUNDED PRECEDING
Du bør enten ændre ORDER BY
eller RANGE
klausul i din forespørgsel.
Ændring af ORDER BY
sætter rækkerne med NULL
id'er til slutningen af vinduet, så en ikke-NULL
værdi (hvis nogen) vil altid blive valgt først, og RANGE
vil garanteret starte fra denne værdi:
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
Ændring af RANGE
omdefinerer området til at inkludere alle ikke-NULL
rækker i partitionen:
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