sql >> Databáze >  >> RDS >> Oracle

Co je špatného na tomto dotazu FIRST_VALUE?

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



  1. Mysql - Jak vyhledat 26 záznamů, z nichž každý začíná písmenem abecedy?

  2. Jak spojit dva sloupce do stejné tabulky

  3. polymorfismus pro omezení FOREIGN KEY

  4. Připojení SSIS k Oracle