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