Slowly Changing Dimension Type 2 dengan SQL (2026)
Blog/Tutorial SQL/Slowly Changing Dimension Type 2 dengan SQL (2026)

Slowly Changing Dimension Type 2 dengan SQL (2026)

BimaBima
·8 Desember 2026·11 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Slowly Changing Dimension Type 2 (SCD Type 2) adalah cara nyimpan riwayat perubahan data di tabel dimensi dengan bikin baris baru tiap ada perubahan, bukan nimpa yang lama. Tiap baris punya kolom valid_from, valid_to, dan is_current buat nandain periode berlakunya. Baris lama ditutup dengan ngisi valid_to dan is_current jadi false, baris baru dibuka dengan is_current true. Hasilnya kamu bisa lihat kondisi data di titik waktu mana pun.

Slowly Changing Dimension Type 2 adalah cara nyimpan riwayat perubahan data dengan bikin baris baru tiap ada update, bukan nimpa yang lama. Jadi kamu tetap bisa lihat kondisi data di masa lalu.

Ini penting pas alamat pelanggan pindah, harga produk berubah, atau tim sales dipindah wilayah. Kalau kamu cuma nimpa datanya, laporan lama jadi salah.

Di bawah ini aku tunjukin cara bikin tabel SCD Type 2 di SQL, kolom apa aja yang wajib ada, dan query buat update sama baca riwayatnya.

Apa itu SCD Type 2 di SQL?

SCD Type 2 adalah teknik di tabel dimensi buat nyimpan tiap versi data sebagai baris terpisah. Pas sebuah nilai berubah, baris lama ditutup dan baris baru dibuka. Tiap baris punya rentang tanggal berlaku, jadi kamu bisa lacak kondisi data di titik waktu mana pun.

Kata dimensi di sini artinya tabel yang nyimpan konteks, kayak data pelanggan, produk, atau pegawai. Bedanya sama tabel fakta yang nyimpan angka transaksi.

Kata slowly changing artinya datanya berubah sesekali, bukan tiap detik. Alamat pelanggan mungkin ganti sekali dalam dua tahun. Itu pas banget buat pola ini.

Kenapa harus pakai SCD Type 2?

Jawaban singkatnya: biar laporan lama tetap akurat. Kalau kamu nimpa data lama, kamu kehilangan konteks saat transaksi dulu terjadi. Bayangan yang sering muncul: pelanggan pindah kota, lalu laporan penjualan tahun lalu ikut berubah kotanya. Itu bikin analisis jadi salah.

Contoh nyata. Pelanggan bernama Budi awalnya di Bandung, terus pindah ke Surabaya. Transaksi bulan Januari harusnya tetap tercatat atas nama Bandung.

Kalau pakai metode Type 1 yang nimpa data, semua transaksi Budi bakal keliatan dari Surabaya. Laporan regional jadi ngaco.

SCD Type 2 nyimpan dua baris Budi. Yang Bandung ditandai berlaku sampai tanggal pindah, yang Surabaya berlaku setelahnya. Analisis pun tetap benar.

Kolom apa yang wajib ada di tabel SCD Type 2?

Tabel SCD Type 2 butuh tiga kolom tambahan di luar kolom data biasa: valid_from, valid_to, dan is_current. Ketiganya yang bikin kamu bisa nandain periode berlaku tiap baris dan cepat nemu versi terkini.

CREATE TABLE dim_pelanggan (
  surrogate_key SERIAL PRIMARY KEY,
  customer_id   VARCHAR(10),
  nama          VARCHAR(100),
  kota          VARCHAR(50),
  valid_from    DATE,
  valid_to      DATE,
  is_current    BOOLEAN
);

Ini fungsi tiap kolom penting:

  • surrogate_key jadi ID unik tiap baris. Beda dari customer_id yang bisa muncul di beberapa baris buat orang yang sama.
  • customer_id ID asli pelanggan. Nilainya tetap walau datanya berubah.
  • valid_from tanggal baris ini mulai berlaku.
  • valid_to tanggal baris ini berhenti berlaku. Baris aktif diisi 9999-12-31.
  • is_current penanda TRUE buat versi terbaru, FALSE buat riwayat.

Perhatiin bedanya customer_id sama surrogate_key. Satu pelanggan bisa punya banyak surrogate_key, tapi customer_id-nya tetap satu. Ini kunci biar kamu bisa gabungin semua versi orang yang sama.

Gimana cara update data dengan SCD Type 2?

Prosesnya dua langkah tiap ada perubahan. Pertama, tutup baris lama dengan ngisi valid_to dan set is_current jadi FALSE. Kedua, masukin baris baru dengan is_current TRUE. Baris lama tetap ada sebagai riwayat.

Misal Budi (customer_id C001) pindah dari Bandung ke Surabaya per 1 Maret 2026. Langkah pertama, tutup baris Bandung:

UPDATE dim_pelanggan
SET valid_to = '2026-02-28',
    is_current = FALSE
WHERE customer_id = 'C001'
  AND is_current = TRUE;

Langkah kedua, buka baris Surabaya:

INSERT INTO dim_pelanggan
  (customer_id, nama, kota, valid_from, valid_to, is_current)
VALUES
  ('C001', 'Budi Santoso', 'Surabaya', '2026-03-01', '9999-12-31', TRUE);

Sekarang tabel punya dua baris buat Budi. Yang Bandung berlaku sampai 28 Februari, yang Surabaya berlaku mulai 1 Maret. Nggak ada data yang hilang.

Kalau kamu pakai database yang dukung MERGE, dua langkah ini bisa digabung. Tapi buat belajar, versi terpisah lebih gampang dipahami.

Cara baca riwayat dari tabel SCD Type 2

Buat ambil kondisi terkini, filter is_current. Buat ambil kondisi di tanggal lampau, pakai BETWEEN di valid_from dan valid_to. Dua query ini yang paling sering kamu pakai sehari-hari.

Kondisi sekarang:

SELECT customer_id, nama, kota
FROM dim_pelanggan
WHERE is_current = TRUE;

Kondisi di tanggal tertentu, misal 15 Januari 2026:

SELECT customer_id, nama, kota
FROM dim_pelanggan
WHERE '2026-01-15' BETWEEN valid_from AND valid_to;

Query kedua ini yang bikin SCD Type 2 spesial. Dia balikin data Budi versi Bandung, karena di 15 Januari dia belum pindah. Cek juga cara pakai window function di SQL kalau kamu mau bandingin versi lama dan baru dalam satu query.

Contoh kasus: dim_produk di toko_berkah

toko_berkah, warung online yang aku pakai buat contoh, ganti harga produk secara berkala. Mereka jual 320 jenis produk. Selama 2026, aku catat ada 47 perubahan harga di tabel dim_produk yang pakai SCD Type 2.

Salah satunya minyak goreng 2 liter. Harga naik dari Rp34.000 ke Rp38.000 per 10 Mei 2026. Tabelnya nyimpan dua baris:

produkhargavalid_fromvalid_tois_current
Minyak 2L34.0002026-01-012026-05-09FALSE
Minyak 2L38.0002026-05-109999-12-31TRUE

Gara-gara riwayat ini kesimpan, tim toko_berkah bisa ngitung margin tiap transaksi pakai harga yang bener saat itu. Transaksi bulan April dihitung pakai harga Rp34.000, bukan harga baru.

Tanpa SCD Type 2, semua 320 transaksi minyak sebelum Mei bakal dihitung pakai Rp38.000. Margin bulan-bulan awal jadi kelihatan lebih besar dari kenyataan. Salah baca kayak gini bisa bikin keputusan stok jadi meleset.

Kesalahan umum saat bikin SCD Type 2

Pertama, lupa nutup baris lama. Kalau kamu insert baris baru tapi is_current baris lama masih TRUE, kamu bakal punya dua versi aktif. Query is_current jadi ngasih hasil dobel.

Kedua, ngisi valid_to baris aktif dengan NULL. Ini bikin filter BETWEEN gagal, soalnya perbandingan sama NULL nggak balikin TRUE. Pakai 9999-12-31 biar aman.

Ketiga, ngelacak riwayat kolom yang berubah terus. Kalau kamu simpan riwayat saldo yang berubah tiap hari, tabel dimensi meledak. Simpan angka yang sering berubah di tabel fakta.

Keempat, pakai customer_id sebagai primary key. Nggak bisa, soalnya satu pelanggan punya banyak baris. Pakai surrogate_key yang unik per baris.

Penutup

SCD Type 2 bikin tabel dimensimu punya ingatan. Tiga hal yang perlu kamu pegang:

  • Tiap perubahan bikin baris baru, baris lama ditutup pakai valid_to dan is_current FALSE.
  • Tiga kolom wajib: valid_from, valid_to, is_current.
  • Baca kondisi lampau pakai BETWEEN, baca kondisi sekarang pakai is_current.

Mau lancar nulis query kayak gini tanpa nunggu tim data? Latihan langsung di panduan belajar SQL dari nol. Buat referensi konsep resmi, baca juga penjelasan SCD Type 2 dari Kimball Group.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
Tutorial SQL
29 Desember 2026•9 menit baca

Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)

NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.

BimaBima
Running Max dan Min dengan Window Function SQL
Tutorial SQL
26 Desember 2026•11 menit baca

Running Max dan Min dengan Window Function SQL

Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.

BimaBima
Analisa Afinitas Produk (Cross-Sell) dengan SQL
Tutorial SQL
23 Desember 2026•12 menit baca

Analisa Afinitas Produk (Cross-Sell) dengan SQL

Produk apa yang sering dibeli bareng? Analisa afinitas produk pakai SQL self JOIN jawab itu. Ini cara hitung support, confidence, dan lift buat strategi cross-sell.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore