LAG, LEAD, dan Pola Deret Waktu
Bandingkan setiap baris dengan baris sebelumnya atau berikutnya menggunakan LAG dan LEAD, lalu buat perubahan antarkperiode.
LAG, LEAD, dan Pola Deret Waktu adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
LAG dan LEAD: Melihat ke Belakang / ke Depan
Fungsi ini mengakses baris di sekitar dalam jendela:
LAG(col, n, default)— nilai n baris sebelum baris saat iniLEAD(col, n, default)— nilai n baris setelahnya
Baris Sebelumnya
Bandingkan setiap pesanan dengan pesanan sebelumnya untuk pengguna yang sama:
SELECT id, user_id, created_at, total,
LAG(total) OVER (
PARTITION BY user_id ORDER BY created_at
) AS prev_total
FROM orders;Perubahan dari Hari ke Hari
Selisih dari hari sebelumnya:
SELECT day, revenue,
revenue - LAG(revenue) OVER (ORDER BY day) AS delta
FROM daily_revenue
ORDER BY day;Perubahan dari Tahun ke Tahun
LAG dengan offset 12 pada rangkaian bulanan:
SELECT month, revenue,
LAG(revenue, 12) OVER (ORDER BY month) AS prev_year_revenue,
revenue / NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) - 1 AS yoy
FROM monthly_revenue;Mendeteksi Celah
Temukan hari yang datanya hilang:
WITH d AS (
SELECT day, LAG(day) OVER (ORDER BY day) AS prev_day FROM daily_signups
)
SELECT day, prev_day, day - prev_day AS gap_days
FROM d
WHERE day - prev_day > 1;Pembentukan Sesi
Kelompokkan baris ke dalam sesi ketika celah melebihi ambang batas:
WITH gaps AS (
SELECT user_id, ts,
CASE WHEN ts - LAG(ts) OVER (PARTITION BY user_id ORDER BY ts)
> INTERVAL '30 min'
THEN 1 ELSE 0 END AS new_session
FROM events
)
SELECT user_id, ts,
SUM(new_session) OVER (PARTITION BY user_id ORDER BY ts) AS session_id
FROM gaps;Nilai Pertama dan Terakhir dalam Grup
FIRST_VALUE dan LAST_VALUE mengambil batas-batas jendela:
SELECT id, total,
FIRST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at) AS first_order,
LAST_VALUE(total) OVER (PARTITION BY user_id ORDER BY created_at
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_order
FROM orders;
-- LAST_VALUE needs the explicit frame, otherwise default frame ends at current row.NTH_VALUE
Pilih nilai ke-N dalam partisi:
SELECT id,
NTH_VALUE(total, 2) OVER (
PARTITION BY user_id ORDER BY total DESC
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS second_largest
FROM orders;Nilai Bawaan Deret Waktu
Argumen ketiga LAG adalah nilai bawaan ketika tidak ada baris sebelumnya:
SELECT day, revenue,
revenue - LAG(revenue, 1, 0) OVER (ORDER BY day) AS delta
FROM daily_revenue;
-- delta on first day = revenue itself (vs NULL)Padanan Penggabungan dengan Tabel Itu Sendiri
Anda dapat menulis LAG sebagai penggabungan tabel dengan tabel itu sendiri, tetapi hasilnya akan lebih lambat dan lebih buruk. Selalu utamakan fungsi jendela.
Kinerja
Fungsi jendela menelusuri partisi satu kali. Hambatannya adalah pengurutan — buat indeks pada kolom ORDER BY jika memungkinkan.
Ringkasan
LAG dan LEAD memungkinkan perbandingan antarbariѕ.
- Sebelumnya/berikutnya dalam partisi
- Perubahan, perbandingan antarperiode, pembentukan sesi
- FIRST_VALUE/LAST_VALUE untuk batas
Pemeriksaan Singkat
Anda ingin menghitung perubahan pendapatan dari hari ke hari. Fungsi jendela mana yang digunakan?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “LAG, LEAD, dan Pola Deret Waktu” gratis?
Ya — teks lengkap “LAG, LEAD, dan Pola Deret Waktu” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “LAG, LEAD, dan Pola Deret Waktu”?
Bandingkan setiap baris dengan baris sebelumnya atau berikutnya menggunakan LAG dan LEAD, lalu buat perubahan antarkperiode. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “LAG, LEAD, dan Pola Deret Waktu” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD, dan Pola Deret Waktu
- Total Berjalan dan Rata-Rata Bergerak