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