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