RANGE / ROWS mặc định cho FIRST_VALUE (như đối với bất kỳ chức năng phân tích nào khác) là BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .
Nếu bạn thêm IGNORE NULLS , rồi đến NULL giá trị không được tính đến khi tạo phạm vi.
RANGE trở thành BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS (nó không phải là OVER hợp lệ mệnh đề).
Kể từ khi txt của bạn đó là NULL có id cao Chúng được chọn đầu tiên và phạm vi của chúng trống, vì không có NULL hàng giữa chúng và UNBOUNDED PRECEDING
Bạn nên thay đổi ORDER BY hoặc RANGE mệnh đề của truy vấn của bạn.
Thay đổi ORDER BY đặt các hàng bằng NULL id ở cuối cửa sổ để không phải là NULL giá trị (nếu có) sẽ luôn được chọn trước tiên và RANGE đảm bảo sẽ bắt đầu từ giá trị đó:
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
Thay đổi RANGE xác định lại phạm vi để bao gồm tất cả không phải NULL hàng trong phân vùng:
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