Sự cố với LAST_VALUE()
là các quy tắc mặc định cho các mệnh đề cửa sổ loại bỏ các giá trị mà bạn thực sự muốn. Đây là một vấn đề rất nhỏ và đúng trong tất cả các cơ sở dữ liệu hỗ trợ chức năng này.
Điều này đến từ một blog của Oracle:
Trong khi chúng ta đang nói về các mệnh đề cửa sổ, mệnh đề cửa sổ ngầm định và có thể hoán đổi cho các hàm FIRST và LAST là ROWSBETWEEN UNBOUNDED PRECEDING VÀ UNBOUNDED F SAU, nói cách khác là các hàng trong phân vùng của chúng ta. Đối với FIRST_VALUE và LAST_VALUE, mệnh đề cửa sổ có thể thay đổi nhưng mặc định là ROWS GIỮA ROW PRECEDINGAND HIỆN TẠI KHÔNG ĐƯỢC BẮT ĐẦU, nói cách khác, chúng tôi loại trừ các hàng sau cái hiện tại. Việc loại bỏ các hàng ở cuối danh sách không có gì khác biệt khi chúng tôi đang tìm kiếm hàng đầu tiên trong danh sách ( FIRST_VALUE) nhưng nó thực sự tạo ra sự khác biệt khi chúng tôi đang tìm kiếm hàng cuối cùng trong danh sách (LAST_VALUE) vì vậy, bạn thường sẽ cần chỉ định ROWS GIỮA BAO LÂU TRƯỚC VÀ KHÔNG ĐƯỢC THEO DÕI một cách rõ ràng khi sử dụngLAST_VALUE hoặc chỉ cần sử dụng FIRST_VALUE và đảo ngược thứ tự sắp xếp .
Do đó, chỉ cần sử dụng FIRST_VALUE()
. Điều này thực hiện những gì bạn muốn:
with test (id, session_ID, value) as (
(VALUES (0, 2, 100),
(1, 2, 120),
(2, 2, 140),
(3, 1, 900),
(4, 1, 800),
(5, 1, 500)
)
)
select id,
first_value(value) over (partition by session_ID order by id) as first_value_window,
first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
from test
order by id