Window
PostgreSQL
LAST_VALUE
Mengembalikan nilai terakhir dalam window frame. PENTING: Tanpa frame clause eksplisit, hanya melihat sampai baris saat ini. Gunakan UNBOUNDED FOLLOWING untuk nilai terakhir sesungguhnya.
Tipe hasil:
same as inputSyntax
SQL
LAST_VALUE(expression) OVER (
[PARTITION BY partition_expression]
ORDER BY sort_expression
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)Parameter
expressionanywajib
Kolom atau ekspresi yang nilainya diambil
ORDER BYexpressionwajib
Menentukan urutan dalam window
PARTITION BYexpressionopsional
Membagi data menjadi grup terpisah
Contoh Penggunaan
Harga Penutupan (Closing Price)
SQL
1 SELECT 2 date, 3 stock_symbol, 4 price, 5 LAST_VALUE(price) OVER ( 6 PARTITION BY stock_symbol 7 ORDER BY date 8 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 9 ) AS closing_price 10 FROM stock_prices;
Mengambil harga terakhir (penutupan) untuk setiap saham.
Hasil
| date | stock_symbol | price | closing_price |
|---|---|---|---|
| 2024-01-01 | BBCA | 10000 | 10500 |
| 2024-01-02 | BBCA | 10200 | 10500 |
| 2024-01-03 | BBCA | 10500 | 10500 |
Gap dari Target Akhir
SQL
1 SELECT 2 month, 3 actual_sales, 4 LAST_VALUE(actual_sales) OVER ( 5 ORDER BY month 6 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 7 ) AS final_sales, 8 LAST_VALUE(actual_sales) OVER (...) - actual_sales AS gap_to_final 9 FROM monthly_performance;
Menghitung gap antara nilai saat ini dengan nilai akhir.
Gotcha: Tanpa Frame Clause
SQL
1 -- SALAH: Akan menghasilkan nilai row saat ini 2 SELECT LAST_VALUE(price) OVER (ORDER BY date) AS wrong; 3 4 -- BENAR: Gunakan frame clause 5 SELECT LAST_VALUE(price) OVER ( 6 ORDER BY date 7 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 8 ) AS correct;
Tanpa frame clause, LAST_VALUE hanya melihat sampai baris saat ini.