Oracle
 sql >> Database >  >> RDS >> Oracle

Qual è il problema con questa query FIRST_VALUE?

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