Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apa yang salah dengan kueri FIRST_VALUE ini?

RANGE / ROWS default untuk FIRST_VALUE (seperti untuk fungsi analitik lainnya) adalah BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .

Jika Anda menambahkan IGNORE NULLS , lalu NULL nilai tidak diperhitungkan saat membangun rentang.

RANGE menjadi BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS (ini bukan OVER yang valid klausa).

Karena txt . Anda yang NULL memiliki id yang tinggi 's, mereka dipilih terlebih dahulu, dan rentangnya kosong, karena tidak ada non-NULL baris di antara mereka dan UNBOUNDED PRECEDING

Anda harus mengubah ORDER BY atau RANGE klausa kueri Anda.

Mengubah ORDER BY menempatkan baris dengan NULL id ke akhir jendela sehingga non-NULL nilai (jika ada) akan selalu dipilih terlebih dahulu, dan RANGE dijamin akan mulai dari nilai itu:

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

Mengubah RANGE mendefinisikan ulang rentang untuk menyertakan semua non-NULL baris dalam partisi:

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. Oracle langsung memuat INSERT melalui JDBC?

  2. Bagaimana cara membandingkan nilai untuk entri terakhir terakhir dan kedua dalam tabel?

  3. cara Flashback ketika kita memiliki dataguard

  4. Cara mendekati Got minus satu dari kesalahan panggilan baca saat menghubungkan ke instans Oracle RDS Amazon

  5. Sql query untuk memeriksa apakah substring kolom 1 berisi nilai kolom lain