Window

LAG

PostgreSQLPostgreSQL

Mengakses nilai dari baris sebelumnya dalam result set berdasarkan offset tertentu. Sangat berguna untuk perbandingan dengan periode sebelumnya.

Tipe hasil: same as expression

Syntax

SQL
LAG(expression [, offset [, default]]) OVER ([PARTITION BY partition_expression] ORDER BY sort_expression)

Parameter

expressionanywajib

Kolom atau ekspresi yang nilainya akan diambil

ORDER BYclausewajib

Menentukan urutan baris untuk perhitungan LAG

offsetintegeropsional

Berapa baris ke belakang (default: 1)

Default: 1

defaultanyopsional

Nilai default jika tidak ada baris sebelumnya

PARTITION BYclauseopsional

Opsional. Membagi hasil ke dalam partition terpisah

Contoh Penggunaan

Perbandingan dengan Bulan Sebelumnya

SQL
1SELECT
2 month,
3 revenue,
4 LAG(revenue) OVER (ORDER BY month) as prev_month_revenue,
5 revenue - LAG(revenue) OVER (ORDER BY month) as revenue_change
6FROM monthly_sales;

Menampilkan revenue bulan ini vs bulan sebelumnya dan selisihnya.

Hasil
monthrevenueprev_monthchange
2024-01100000NULLNULL
2024-0212000010000020000
2024-03115000120000-5000

LAG dengan Default Value

SQL
1SELECT
2 date,
3 price,
4 LAG(price, 1, price) OVER (ORDER BY date) as prev_price,
5 ROUND((price - LAG(price, 1, price) OVER (ORDER BY date)) /
6 LAG(price, 1, price) OVER (ORDER BY date) * 100, 2) as pct_change
7FROM stock_prices
8WHERE symbol = 'AAPL';

Menghitung persentase perubahan harga saham. Default value mencegah division by zero di baris pertama.

LAG per Customer (PARTITION BY)

SQL
1SELECT
2 customer_id,
3 order_date,
4 order_total,
5 LAG(order_date) OVER (
6 PARTITION BY customer_id
7 ORDER BY order_date
8 ) as prev_order_date,
9 order_date - LAG(order_date) OVER (
10 PARTITION BY customer_id
11 ORDER BY order_date
12 ) as days_between_orders
13FROM orders;

Menghitung jarak hari antar order untuk setiap customer.

Hasil
customer_idorder_dateorder_totalprev_order_datedays_between
12024-01-1550000NULLNULL
12024-02-20750002024-01-1536
12024-03-10600002024-02-2019
22024-01-2040000NULLNULL
... 1 baris lainnya