Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Co jest nie tak z tym zapytaniem FIRST_VALUE?

Domyślny RANGE / ROWS dla FIRST_VALUE (jak w przypadku każdej innej funkcji analitycznej) jest BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .

Jeśli dodasz IGNORE NULLS , a następnie NULL wartości nie są brane pod uwagę podczas budowania zakresu.

RANGE staje się BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS (to nie jest prawidłowy OVER klauzula).

Ponieważ twój txt , które są NULL mieć wysoki id są wybierane jako pierwsze, a ich zakresy są puste, ponieważ nie ma wartości innych niż NULL wierszy między nimi i UNBOUNDED PRECEDING

Powinieneś zmienić albo ORDER BY lub RANGE klauzula zapytania.

Zmiana ORDER BY umieszcza wiersze z NULL id znajduje się na końcu okna, więc nie NULL wartość (jeśli istnieje) będzie zawsze wybierana jako pierwsza, a RANGE na pewno zacznie się od tej wartości:

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

Zmiana RANGE redefiniuje zakres, aby uwzględnić wszystkie inne niż NULL wiersze w partycji:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wyeksportować zawartość tabeli Oracle do pliku?

  2. Dodawanie wielu funkcji walidacji (UDF) do Oracle — która metoda działa najszybciej

  3. Dzielenie łańcucha złożonego za pomocą wyrażenia regularnego

  4. Uzyskaj słowo po określonym słowie, używając regexp_substr w sql oracle

  5. Wygeneruj zakres dat z dwóch kolumn dat