RANGE / RIGHE
predefinito per FIRST_VALUE
(come per ogni altra funzione analitica) è TRA UNBOUNDED PRECEDENTE E RIGA CORRENTE
.
Se aggiungi IGNORA NULLS
, quindi NULL
i valori non vengono presi in considerazione durante la creazione dell'intervallo.
Il GAMMA
diventa TRA IL PRECEDENTE SENZA LIMITI E LA RIGA ATTUALE ECCETTO LE RIGHE NULLE
(non è un OVER
valido clausola).
Dal tuo txt
sono NULL
avere un id
alto 's, vengono selezionati per primi e i loro intervalli sono vuoti, poiché non ci sono NULL
diversi da NULL
righe tra loro e UNBOUNDED PRECEDING
Dovresti cambiare ORDER BY
o GAMMA
clausola della tua richiesta.
Modifica di ORDINA PER
inserisce le righe con NULL
id è alla fine della finestra in modo che non sia NULL
il valore (se presente) sarà sempre selezionato per primo e il RANGE
partirà sicuramente da quel valore:
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
Modifica di RANGE
ridefinisce l'intervallo per includere tutti i non NULL
righe nella partizione:
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