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