Masalah dengan LAST_VALUE()
adalah bahwa aturan default untuk klausa windowing menghapus nilai yang benar-benar Anda inginkan. Ini adalah masalah yang sangat halus dan benar di semua database yang mendukung fungsi ini.
Ini berasal dari blog Oracle:
Sementara kita membahas topik klausa windowing, klausa window implisit dan tidak dapat diubah untuk fungsi FIRST dan LAST adalah ROWBETWEEN UNBOUNDED PRECEDING DAN UNBOUNDED FOLLOWING, dengan kata lain semua baris di partisi kita. Untuk FIRST_VALUE dan LAST_VALUE default tetapi klausa windowing yang dapat diubah adalah BARIS ANTARA PRECEDING YANG TIDAK TERBATAS DAN BARIS LANCAR, dengan kata lain kami mengecualikan baris setelah yang sekarang. Menjatuhkan baris dari bagian bawah daftar tidak ada bedanya ketika kami mencari baris pertama dalam daftar ( FIRST_VALUE) tetapi itu membuat perbedaan ketika kami mencari baris terakhir dalam daftar (LAST_VALUE) jadi Anda biasanya perlu menentukan BARIS ANTARA TAK TERBATAS SEBELUMNYA DAN UNBOUNDED FOLLOWING secara eksplisit saat menggunakanLAST_VALUE atau cukup gunakan FIRST_VALUE dan balikkan urutan pengurutannya .
Karenanya, cukup gunakan FIRST_VALUE()
. Ini melakukan apa yang Anda inginkan:
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