Perubahan Antar-Periode
Hitung pertumbuhan dari bulan ke bulan dan perubahan dari hari ke hari dengan LAG.
Perubahan Antar-Periode adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Pertanyaan Analis yang Hampir Pasti Muncul
Jika Anda melamar posisi analis data, bersiaplah untuk pertanyaan: "Hitung pertumbuhan dari bulan ke bulan" atau "Berapa perubahan dari hari ke hari?" Pertanyaan ini hampir tidak mungkin dihindari.
Dasarnya adalah LAG: ambil nilai periode sebelumnya, lalu hitung selisih absolut atau perubahan persentase. Pelajaran ini mengubah LAG menjadi pola perubahan dari periode ke periode yang dinilai oleh pewawancara.
Perubahan Absolut dengan LAG
Versi paling sederhana adalah selisih mentah antara periode ini dan periode sebelumnya. Ambil nilai sebelumnya dengan LAG, lalu kurangkan secara langsung.
Baris pertama dalam urutan tidak memiliki pendahulu, sehingga perubahannya adalah NULL. Itu benar, bukan kesalahan: memang tidak ada periode sebelumnya untuk dijadikan pembanding.
SELECT
month,
revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;Perubahan Persentase
Pewawancara biasanya menginginkan pertumbuhan dalam bentuk persen. Rumusnya adalah (saat ini - sebelumnya) / sebelumnya, dikalikan 100. Tuliskan secara langsung dengan LAG.
Perhatikan urutan operasi dan tanda kurung; kesalahan penempatan tanda kurung adalah kesalahan klasik saat berada di bawah tekanan.
SELECT
month,
revenue,
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;Hindari Pembagian Bilangan Bulat
Ini adalah perangkap yang membuat banyak kandidat tersandung: jika revenue adalah bilangan bulat, (110 - 100) / 100 dievaluasi menjadi 0 pada basis data yang menggunakan pembagian bilangan bulat.
Kalikan dengan 100.0 (literal titik mengambang) atau gunakan CAST untuk mengonversinya menjadi desimal terlebih dahulu agar memaksa perhitungan titik mengambang. Menyebutkan hal ini secara proaktif menunjukkan ketelitian.
SELECT
month,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month), 2
) AS pct_growth
FROM monthly_sales;Lebih Rapi: Hitung Sekali dalam CTE
Memanggil LAG dua kali (untuk pembilang dan penyebut) bersifat repetitif dan mudah salah ketik. Refaktor yang umum adalah menghitung nilai sebelumnya sekali dalam CTE, lalu melakukan aritmetika dalam kueri luar.
Penulisan ini lebih baik dalam wawancara papan tulis dan menghindari perbedaan antara kedua pemanggilan LAG.
WITH t AS (
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
)
SELECT
month,
revenue,
ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;Cegah Pembagian dengan Nol
Jika nilai periode sebelumnya dapat berupa 0, rumus persentase akan membagi dengan nol dan menghasilkan kesalahan. Gunakan NULLIF(prev, 0) agar penyebut menjadi NULL dan hasilnya menjadi NULL, bukan pengecualian.
Pembagian yang aman terhadap kasus ini adalah sentuhan kecil yang diperhatikan pewawancara pada kandidat yang berorientasi pada lingkungan produksi.
SELECT
month,
revenue,
100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
) s;Perubahan dari Periode ke Periode per Grup
Sebagian besar pertanyaan nyata memiliki cakupan: pertumbuhan bulan ke bulan per produk atau per wilayah. Tambahkan PARTITION BY agar rangkaian setiap grup dibandingkan hanya dengan dirinya sendiri.
Bulan paling awal setiap grup menghasilkan NULL, dan tidak pernah dibandingkan melintasi batas produk.
SELECT
product_id,
month,
revenue,
revenue - LAG(revenue) OVER (
PARTITION BY product_id
ORDER BY month
) AS mom_change
FROM product_sales;Perubahan Tahunan dengan Pergeseran
Untuk perbandingan tahun ke tahun pada data bulanan ketika baris berjarak satu bulan, Anda membandingkan nilai 12 baris sebelumnya. Argumen pergeseran melakukan hal ini secara langsung: LAG(revenue, 12).
Ini mengasumsikan satu baris per bulan tanpa celah. Jika ada bulan yang mungkin hilang, Anda sebaiknya menggabungkan berdasarkan tanggal eksplisit, suatu nuansa yang layak disebutkan dengan lantang.
SELECT
month,
revenue,
revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;Agregasikan Terlebih Dahulu Sebelum Membandingkan
Tabel peristiwa mentah belum dijumlahkan per bulan. Jawaban yang realistis pertama-tama mengagregasikan data menjadi satu baris per periode, lalu menerapkan LAG pada hasil agregasi, biasanya melalui CTE.
Mencoba menerapkan LAG pada baris yang belum diagregasi akan membandingkan transaksi individual, bukan total bulanan, yang merupakan kesalahan logis umum.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
)
SELECT mth, revenue,
revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;Menafsirkan NULL Pertama
Pewawancara terkadang bertanya: "Mengapa pertumbuhan pada baris pertama Anda adalah NULL, dan apakah itu dapat diterima?" Jawaban yang tepat: tidak ada periode sebelumnya, sehingga perubahan tidak terdefinisi, dan NULL secara tepat merepresentasikan keadaan tersebut.
Jika bisnis menginginkan 0, Anda dapat menggunakan LAG(revenue, 1, 0) atau COALESCE, tetapi hanya jika sesuai dengan makna yang dimaksud.
Memberi Label Arah Pertumbuhan
Pewawancara terkadang memperluas pertanyaan: "Tandai juga apakah setiap bulan tumbuh, menyusut, atau tetap." Bungkus perbandingan LAG dalam ekspresi CASE.
Membandingkan dengan nilai sebelumnya memberikan kolom tren yang jelas dan mudah dipahami manusia di samping selisih numerik, serta dengan baik menampilkan NULL atau label bawaan untuk periode pertama yang tidak memiliki pembanding.
SELECT
month,
revenue,
CASE
WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
ELSE 'flat'
END AS trend
FROM monthly_sales
ORDER BY month;Pemeriksaan Singkat
Temukan kesalahan umum dalam kueri perubahan persentase.
Ringkasan
Perubahan dari periode ke periode adalah LAG ditambah aritmetika:
- Perubahan absolut:
value - LAG(value) OVER (ORDER BY period). - Perubahan persentase:
100.0 * (value - prev) / NULLIF(prev, 0). - Paksa perhitungan titik mengambang, cegah pembagian dengan nol, dan agregasikan terlebih dahulu hingga satu baris per periode.
- Tentukan cakupan dengan
PARTITION BY; gunakan pergeseran untuk perbandingan tahun ke tahun.
Berikutnya: membagi baris ke dalam kelompok dan tingkatan dengan NTILE.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Perubahan Antar-Periode” gratis?
Ya — teks lengkap “Perubahan Antar-Periode” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Perubahan Antar-Periode”?
Hitung pertumbuhan dari bulan ke bulan dan perubahan dari hari ke hari dengan LAG. Kamu berlatih Coding Interview Prep 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 Coding Interview Prep?
Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep 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 2 dari 4.
Berapa lama pelajaran “Perubahan Antar-Periode” 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 Coding Interview Prep ini?
Ya. Setiap pelajaran Coding Interview Prep 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
- LAG dan LEAD untuk Baris Berdekatan
- Perubahan Antar-Periode
- NTILE untuk Pengelompokan Rentang
- FIRST_VALUE, LAST_VALUE, dan Tepi Frame