Halo, senang sekali Anda di sini. Seperti yang saya sebutkan dalam video, data cleaning bukanlah tugas sampingan yang membosankan. Ini adalah fondasi dari semua pekerjaan data yang berkualitas.
Banyak orang berpikir pekerjaan data itu glamorβmembuat prediksi AI yang canggih atau dashboard yang cantik. Kenyataannya, 80% waktu kita dihabiskan untuk "berdebat" dengan data: membersihkannya, merapikannya, dan membuatnya masuk akal.
Saya akan memandu Anda melalui proses end-to-end ini, persis seperti yang saya lakukan di dunia kerja nyata menggunakan Google BigQuery. Mari kita bedah materi ini menjadi sebuah modul pembelajaran yang komprehensif.
π Sudut Pandang yang Jarang Terlihat: Data Cleaning Bukan Sekadar Kode, Tapi Keputusan Bisnis
Ini adalah insight utama yang sering dilewatkan pemula. Anda bisa hafal semua fungsi SQL, tapi itu tidak ada artinya jika Anda tidak mengerti mengapa Anda membersihkannya.
Saat saya melihat data customer_orders kita, saya tidak hanya melihat baris dan kolom. Saya melihat cerita dari sebuah proses bisnis yang tidak sempurna:
- Status Pesanan Berantakan: ('delivered', 'Delivered', 'DELIVERED')
- Artinya: Data ini mungkin diinput dari tiga sistem yang berbeda (misalnya, aplikasi mobile, entri manual gudang, dan sistem web) yang tidak memiliki aturan validasi yang sama.
- Kuantitas Aneh: ('2', 'two')
- Artinya: Ada kolom free-text di suatu tempat yang seharusnya berupa drop-down angka. Ini adalah mimpi buruk untuk analisis (SUM(quantity) akan gagal total).
- Nama Pelanggan Tidak Konsisten: ('john smith', 'SARAH THOMPSON')
- Artinya: Kita tidak bisa menjawab pertanyaan sederhana seperti, "Berapa jumlah pelanggan unik kita?" karena 'john smith' dan 'John Smith' akan dihitung sebagai dua orang yang berbeda.
Pekerjaan kita sebagai profesional data bukanlah menjadi "tukang bersih-bersih". Pekerjaan kita adalah menjadi "penerjemah" dan "penentu standar". Kita mengambil data yang kacau ini dan menerjemahkannya menjadi satu sumber kebenaran (single source of truth) yang bisa dipercaya oleh tim bisnis untuk mengambil keputusan.
π Apa yang bisa kamu lakukan sekarang: Sebelum menulis satu baris kode pun, buka dataset apa saja. Lihat 100 baris pertamanya. Tuliskan 3-5 "keanehan" yang kamu temukan dan tebak mengapa keanehan itu bisa terjadi di dunia nyata.
π οΈ Modul Pembelajaran: Menguasai Data Cleaning dengan SQL
Mari kita bedah setiap teknik yang saya tunjukkan.
Teknik #1: Standarisasi Teks (The Janitor)
Ini adalah langkah paling dasar. Kita menyamakan semua nilai yang memiliki arti sama tapi formatnya berbeda.
- Masalah: Kolom order_status dan product_name memiliki kapitalisasi yang tidak konsisten.
- Senjata SQL: LOWER(), CASE WHEN, dan LIKE %...%.
- Proses Berpikir:
- Saya tidak bisa hanya menggunakan WHERE order_status = 'delivered' karena akan kehilangan 'Delivered' dan 'DELIVERED'.
- Solusinya adalah "memaksa" semuanya menjadi huruf kecil terlebih dahulu agar seragam. Itulah gunanya LOWER(order_status).
- Saya menggunakan LIKE '%deliver%' (dengan wildcard %) untuk menangkap variasi apa pun yang mengandung kata 'deliver'. Ini lebih aman daripada LOWER(order_status) = 'delivered'.
- CASE WHEN adalah alat "jika-maka" di SQL. Ini seperti membuat aturan baru: "Jika kamu menemukan sesuatu yang mirip 'deliver', sebut dia 'Delivered' (versi bersih)."
Contoh Kode (untuk order_status):
SQL
SELECT
order_status, -- Kolom asli
CASE
WHEN LOWER(order_status) LIKE '%deliver%' THEN 'Delivered'
WHEN LOWER(order_status) LIKE '%shipped%' THEN 'Shipped'
WHEN LOWER(order_status) LIKE '%pending%' THEN 'Pending'
WHEN LOWER(order_status) LIKE '%refund%' THEN 'Refunded'
WHEN LOWER(order_status) LIKE '%return%' THEN 'Returned'
ELSE 'Other' -- Selalu siapkan "keranjang lain-lain"
END AS cleaned_order_status -- Kolom baru yang bersih
FROM
`nama-project.nama-dataset.customer_orders`
- Insight Profesional: Klausul ELSE 'Other' sangat penting. Ini membantu Anda menemukan nilai-nilai baru yang tidak terduga di masa depan. Jika Anda tidak menambahkannya dan ada status baru (misal 'Cancelled'), status itu akan menjadi NULL, dan Anda akan kehilangan data.
π Apa yang bisa kamu lakukan sekarang: Ambil dataset kamu. Cari satu kolom kategori (seperti product_name atau country). Gunakan SELECT DISTINCT nama_kolom untuk melihat semua nilai uniknya. Apakah ada yang tidak konsisten? Bersihkan menggunakan CASE WHEN dan LOWER().
Teknik #2: Membersihkan Tipe Data (The Translator)
Data tidak bisa dianalisis jika tipe datanya salah. Anda tidak bisa menjumlahkan (SUM) sebuah kata.
- Masalah: Kolom quantity berisi angka (1, 2) dan teks ('two').
- Senjata SQL: CASE WHEN dan CAST().
- Proses Berpikir:
- Saya harus mengubah 'two' menjadi 2 secara manual.
- Setelah semua nilai dijamin berupa angka, saya harus mengubah tipe data seluruh kolom dari Teks (String) menjadi Angka (Integer).
- Fungsi CAST(nama_kolom AS INT64) adalah cara kita memberi tahu BigQuery, "Tolong, perlakukan kolom ini sebagai angka bulat." (Di database lain mungkin INTEGER).
Contoh Kode:
SQL
SELECT
quantity, -- Kolom asli
CASE
WHEN LOWER(quantity) = 'two' THEN 2
-- Tambahkan aturan lain jika ada, misal 'one' THEN 1
ELSE CAST(quantity AS INT64) -- Ubah sisanya menjadi angka
END AS cleaned_quantity
FROM
`nama-project.nama-dataset.customer_orders`
- Insight Profesional: Perintah CAST bisa gagal. Jika ada nilai 'abc' yang lupa Anda tangani di CASE WHEN, seluruh query Anda akan error. Inilah mengapa proses "mentah" yang saya tunjukkan (penuh error dan debugging) sangat realistis. Selalu periksa data Anda sebelum melakukan CAST.
π Apa yang bisa kamu lakukan sekarang: Cari kolom di dataset Anda yang seharusnya angka tapi mungkin terbaca sebagai teks (sering terjadi pada file CSV). Coba jalankan SELECT SUM(nama_kolom). Jika gagal, gunakan CASE WHEN untuk memperbaiki nilai yang salah, lalu CAST sisanya.
Teknik #3: Memperbaiki Format Teks (The Beautifier)
Ini bukan hanya soal estetika, tapi soal konsistensi untuk grouping dan presentasi.
- Masalah: Kolom customer_name tidak rapi ('john smith', 'SARAH THOMPSON').
- Senjata SQL: INITCAP().
- Proses Berpikir:
- Saya ingin formatnya standar: "Nama Depan Nama Belakang".
- Melakukan ini dengan CASE WHEN akan mustahil karena ada ribuan nama.
- Untungnya, BigQuery (dan banyak database lain) punya fungsi INITCAP() yang secara otomatis mengubah setiap awal kata menjadi huruf kapital.
Contoh Kode:
SQL
SELECT customer_name, -- Kolom asli INITCAP(customer_name) AS cleaned_customer_name FROM `nama-project.nama-dataset.customer_orders` WHERE customer_name IS NOT NULL -- Penting, kita tidak perlu memproses NULL
- Insight Profesional: Seperti yang Anda lihat di video, saya sempat salah ketik fungsi. Ini normal! Bagian penting lainnya adalah WHERE customer_name IS NOT NULL. Memfilter NULL di awal membuat query Anda berjalan lebih cepat karena tidak memproses baris yang sudah pasti tidak berguna.
π Apa yang bisa kamu lakukan sekarang: Ambil kolom nama, alamat, atau kota. Terapkan INITCAP() padanya. Lihat perbedaannya.
Teknik #4: Menghapus Duplikasi (The Detective - Advanced)
Ini adalah teknik tingkat lanjut yang memisahkan analis junior dan senior. Menemukan duplikasi adalah sebuah seni.
- Masalah: Ada pesanan yang terlihat sama persis, mungkin karena kesalahan sistem atau double-click saat checkout.
- Asumsi Bisnis (PENTING!): Saya berasumsi bahwa satu Email yang sama memesan Produk yang sama persis adalah sebuah duplikasi. order_id mungkin berbeda, tapi intinya sama.
- Senjata SQL: Window Function ROW_NUMBER() dan PARTITION BY.
- Proses Berpikir:
- Saya perlu "mengelompokkan" baris-baris yang identik berdasarkan asumsi saya (Email + Produk). Inilah gunanya PARTITION BY LOWER(email), LOWER(product_name).
- Di dalam setiap kelompok itu, saya perlu memberi nomor urut (1, 2, 3...). Inilah gunanya ROW_NUMBER(). Saya mengurutkannya berdasarkan order_id agar konsisten.
- Ini akan menghasilkan kolom baru (saya sebut rn atau row number).
- Semua baris yang rn = 1 adalah baris asli. Semua yang rn = 2, rn = 3, dst., adalah duplikat.
- Kita tidak bisa memfilter WHERE rn > 1 di query yang sama. Kita harus "membungkusnya" dalam subquery atau CTE (Common Table Expression).
Contoh Kode (Menggunakan CTE):
SQL
WITH RankedData AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY
LOWER(email),
LOWER(product_name) -- Ini adalah definisi 'duplikat' kita
ORDER BY
order_id -- 'Baris pertama' ditentukan oleh order_id terlama
) AS rn
FROM
`nama-project.nama-dataset.customer_orders`
)
SELECT
*
FROM
RankedData
WHERE
rn = 1 -- Hanya ambil baris 'asli' dan buang sisanya
- Insight Profesional: PARTITION BY adalah bagian terpenting. Jika Anda salah mendefinisikan duplikasi, Anda bisa menghapus data yang valid. Sebelum menghapus, selalu tanyakan pada tim bisnis: "Apakah mungkin seorang pelanggan memesan produk yang sama dua kali di hari yang sama? Mungkinkah itu pesanan hadiah?" Jangan pernah berasumsi.
π Apa yang bisa kamu lakukan sekarang: Pikirkan dataset Anda. Apa yang mendefinisikan sebuah baris "unik"? Apakah itu user_id? Atau kombinasi user_id + session_id? Coba tulis query ROW_NUMBER() untuk menemukan duplikat berdasarkan definisi Anda.
Teknik #5: Menggabungkan Semuanya (The Final Blueprint)
Kita tidak menjalankan pembersihan ini satu per satu. Kita menggabungkannya menjadi satu query besar yang rapi menggunakan Common Table Expressions (CTEs).
- Masalah: Bagaimana cara menerapkan semua 4 teknik di atas secara berurutan?
- Senjata SQL: WITH ... AS (...).
- Proses Berpikir:
- CTE adalah tabel sementara yang hanya ada selama query berjalan. Ini membuat kode sangat mudah dibaca.
- CTE Pertama (clean_data): Saya lakukan semua pembersihan standar (Teknik #1, #2, #3) di sini.
- CTE Kedua (deduplicated_data): Saya ambil data dari clean_data dan terapkan Teknik #4 (hapus duplikasi) padanya.
- Final SELECT: Saya SELECT * dari deduplicated_data di mana rn = 1.
Ini adalah blueprint final yang saya tunjukkan. Ini adalah cara profesional menstrukturkan query pembersihan yang kompleks.
SQL
-- CTE 1: Pembersihan dasar
WITH clean_data AS (
SELECT
order_id,
INITCAP(customer_name) AS cleaned_customer_name,
LOWER(email) AS cleaned_email, -- Standarisasi email juga!
order_date,
-- ... (CASE WHEN untuk product_name) ...
-- ... (CASE WHEN untuk quantity) ...
-- ... (CASE WHEN untuk order_status) ...
country,
notes
FROM
`nama-project.nama-dataset.customer_orders`
WHERE
customer_name IS NOT NULL
),
-- CTE 2: Menghapus duplikasi dari data yang sudah bersih
deduplicated_data AS (
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY
cleaned_email,
cleaned_product_name
ORDER BY
order_id
) AS rn
FROM
clean_data
)
-- Final: Pilih hanya data bersih dan unik
SELECT
*
FROM
deduplicated_data
WHERE
rn = 1;
- Insight Profesional: Keindahan struktur ini adalah modularitas. Jika besok ada aturan pembersihan baru (misal, membersihkan kolom country), Anda hanya perlu mengedit CTE clean_data tanpa mengganggu logika deduplikasi sama sekali. Kode bersih adalah kode yang mudah dipelihara.
π Apa yang bisa kamu lakukan sekarang: Gabungkan semua script pembersihan yang telah kamu tulis untuk dataset-mu ke dalam satu query menggunakan struktur WITH ... AS (...).
β Checklist & Rencana Aksi Anda
Jangan hanya membaca ini. Praktik adalah kuncinya.
Inilah checklist Anda untuk mempraktikkan ilmu ini hari ini:
- Dapatkan Data: Cari dataset mentah yang "kacau". (Banyak di Kaggle, cari yang punya banyak kolom teks atau data tidak terstruktur).
- Lakukan Investigasi (Investigate):
- SELECT * FROM ... LIMIT 100 (Lihat datanya).
- SELECT DISTINCT nama_kolom_kategori FROM ... (Cari inkonsistensi).
- Periksa tipe data di skema. Apakah ada angka yang tersimpan sebagai string?
- Tulis Rencana Pembersihan: Buat daftar di kertas, kolom apa yang akan dibersihkan dan dengan aturan apa. (Contoh: "Kolom 'Status' -> samakan jadi 'Lulus', 'Gagal'.")
- Eksekusi (Execute): Terapkan teknik-teknik di atas satu per satu.
- [ ] Gunakan LOWER() dan CASE WHEN untuk standarisasi teks.
- [ ] Gunakan CAST() untuk memperbaiki tipe data.
- [ ] Gunakan INITCAP() untuk merapikan nama/lokasi.
- Validasi (Validate):
- [ ] Gunakan ROW_NUMBER() dan PARTITION BY untuk mengecek duplikasi.
- [ ] Jalankan SELECT DISTINCT lagi pada kolom yang sudah Anda bersihkan. Apakah sekarang sudah rapi?
- Gabungkan (Consolidate): Susun ulang semua query Anda menjadi satu script yang rapi menggunakan CTEs (WITH ... AS ...).
Ini adalah proses end-to-end yang dilakukan profesional data setiap hari. Sekarang, giliran Anda untuk mencobanya.
Saya harap materi ini bermanfaat dan memberi Anda gambaran "mentah" tentang apa yang sebenarnya kita lakukan. Selamat mencoba!
π Glosarium: Dari Awam Menjadi Paham Data Cleaning
Berikut adalah istilah-istilah kunci yang sering membuat bingung, kini dijelaskan dengan sederhana.
1. CASE WHEN ... END
- Penjelasan Sederhana: Ini adalah perintah "Jika... Maka..." di dalam SQL. Anda memberi SQL serangkaian aturan, dan SQL akan mengeksekusinya baris per baris.
- Analogi (Satpam Pesta): Bayangkan Anda adalah satpam di sebuah pesta dengan aturan pakaian.
- CASE (Saat saya mengecek tamu...)
- WHEN order_status = 'delivered' (JIKA tamu pakai baju 'delivered'...) THEN 'Terkirim' (MAKA saya beri dia stiker 'Terkirim'.)
- WHEN order_status = 'DELIVERED' (JIKA tamu pakai baju 'DELIVERED'...) THEN 'Terkirim' (MAKA saya tetap beri stiker 'Terkirim'.)
- ELSE 'Lainnya' (JIKA dia pakai baju lain...) (MAKA saya beri stiker 'Lainnya'.)
- END (Pekerjaan mengecek selesai.)
- Studi Kasus Video: Digunakan untuk menyeragamkan kolom order_status yang punya banyak variasi (delivered, Delivered, DELIVERED) menjadi satu nilai bersih: Delivered.
2. CAST()
- Penjelasan Sederhana: Perintah untuk mengubah "tipe data" atau "KTP" sebuah kolom.
- Analogi (Penukar Uang): Bayangkan Anda punya "Dolar" tapi ingin belanja di Indonesia. Anda tidak bisa. Anda harus pergi ke money changer untuk mengubahnya jadi "Rupiah". CAST adalah money changer itu.
- Studi Kasus Video: Kolom quantity berisi angka 2 tapi juga teks 'two'. Setelah kita ubah 'two' menjadi '2' (pakai CASE WHEN), seluruh kolom itu mungkin masih dianggap "Teks" oleh komputer. Kita harus menggunakan CAST(quantity AS INT64) untuk "menukar" tipe datanya dari Teks menjadi INT64 (Angka Bulat) agar bisa dijumlahkan (SUM) atau dirata-rata (AVG).
3. LIKE %...% (Wildcard)
- Penjelasan Sederhana: Perintah pencarian "mirip" atau "mengandung", bukan "sama persis". Tanda % adalah joker-nya.
- Analogi (Filter Pencarian):
- LIKE 'deliver%': Mencari semua kata yang dimulai dengan 'deliver'. (Contoh: 'delivered', 'delivery_pending').
- LIKE '%deliver': Mencari semua kata yang diakhiri dengan 'deliver'.
- LIKE '%deliver%': Mencari semua kata yang mengandung 'deliver' di mana saja. (Contoh: 'fast_delivered', 'delivered_ok', 'undelivered').
- Studi Kasus Video: Saat membersihkan order_status, menggunakan WHEN LOWER(order_status) LIKE '%deliver%' jauh lebih aman daripada WHEN LOWER(order_status) = 'delivered'. Ini akan menangkap semua variasi yang mungkin kita lewatkan.
4. Window Function (Fungsi Jendela)
- Penjelasan Sederhana: Ini adalah fungsi super canggih yang bisa melakukan perhitungan terhadap sekelompok baris (disebut "jendela" atau "partisi") tanpa harus menggabungkannya.
- Analogi (Juri Lomba Lari): Bayangkan lomba lari yang pesertanya dari 3 sekolah berbeda (A, B, C) dan mereka semua berlari di lintasan yang sama.
- Fungsi biasa (GROUP BY): Akan menghentikan lomba, memisahkan murid ke grup A, B, dan C, lalu hanya memberi tahu Anda siapa juara 1 di setiap sekolah. Anda kehilangan info pelari lainnya.
- Window Function: Juri tetap membiarkan semua murid berlari. Juri hanya "membagi" pandangannya ke 3 "jendela" (partisi): Jendela A, Jendela B, Jendela C. Sambil lomba berjalan, juri memberi ranking (1, 2, 3...) ke setiap murid di dalam jendelanya masing-masing.
- Istilah Terkait:
- PARTITION BY: Ini adalah perintah untuk "membagi jendela". (Contoh: PARTITION BY sekolah).
- ROW_NUMBER(): Ini adalah "juri" yang memberi nomor urut (1, 2, 3...) pada setiap baris di dalam jendela itu.
- Studi Kasus Video: Digunakan untuk mencari duplikat. Kita bilang ke SQL: PARTITION BY email, product_name. Artinya, "Bagi jendelamu berdasarkan email dan produk yang sama." Lalu ROW_NUMBER() memberi nomor 1, 2, 3... untuk setiap pesanan di dalam grup itu. Semua baris yang dapat nomor 2 atau lebih adalah duplikat yang harus dibuang.
5. CTE (Common Table Expression) atau WITH ... AS
- Penjelasan Sederhana: Cara memberi "nama panggilan" atau membuat tabel sementara yang hanya ada selama query Anda berjalan. Ini membuat query yang panjang dan rumit jadi super rapi.
- Analogi (Resep Masakan): Bayangkan Anda menulis resep yang rumit.
- Tanpa CTE: "Ambil 1 sdt garam, 1 sdt lada, 2 sdt bawang putih bubuk. Campur. Sisihkan. Nanti, ambil campuran 1 sdt garam, 1 sdt lada, 2 sdt bawang putih bubuk tadi dan balurkan ke ayam." (Berantakan dan berulang-ulang).
- Dengan CTE:
- WITH Bumbu_Dasar AS (SELECT 1 sdt garam, 1 sdt lada, 2 sdt bawang putih bubuk)
- ...lalu di langkah selanjutnya Anda tinggal bilang: "Ambil Bumbu_Dasar dan balurkan ke ayam."
- Studi Kasus Video: Kita membuat CTE pertama bernama clean_data untuk melakukan semua pembersihan dasar (standarisasi status, perbaikan kuantitas). Lalu, kita membuat CTE kedua bernama deduplicated_data yang mengambil data dari clean_data untuk menghapus duplikat. Kodenya jadi bersih, modular, dan mudah dibaca.
π¨βπ« Teks Untuk Mengajarkan (Gunakan Ini!)
(Anda bisa gunakan ini sebagai skrip video, materi presentasi, atau saat mengobrol dengan teman)
"Halo! Kemarin saya baru belajar sesuatu yang keren banget soal data, dan saya mau share ilmunya ke kamu. Ternyata, jadi seorang analis data itu 80% waktunya bukan bikin grafik keren, tapi "membersihkan" data yang berantakan.
Bayangkan kita dikasih data penjualan. Kelihatannya simpel, tapi pas dibuka... kacau!
- Ada yang nulis statusnya 'delivered', ada yang 'Delivered', ada yang 'DELIVERED'. Komputer anggap ini 3 hal beda!
- Terus, di kolom jumlah (quantity), ada yang nulis angka 2, tapi ada yang nulis teks 'two'. Gimana coba mau menjumlahkannya?
- Lebih parah, ada pesanan yang datanya masuk dua kali (duplikat).
Kalau data ini langsung dipakai, laporannya pasti salah total. Nah, di sinilah kita pakai 'jurus-jurus' SQL untuk membersihkannya.
Jurus 1: Satpam Penyeragaman (CASE WHEN)
Untuk masalah status 'delivered' yang beda-beda tadi, kita pakai perintah CASE WHEN.
Ini kayak kita nyuruh satpam: "Pak Satpam (CASE), JIKA (WHEN) ada yang statusnya mengandung kata 'deliver' (pakai LIKE '%deliver%'), MAKA (THEN) kasih stiker baru 'Terkirim'. Kalau beda, kasih stiker 'Lainnya'. Selesai (END)."
Hasilnya? Semua yang tadinya beda-beda, sekarang seragam jadi 'Terkirim'. Beres satu masalah.
Jurus 2: Si Penukar Uang (CAST)
Untuk masalah angka 2 vs 'two', kita selesaikan dalam dua langkah.
Pertama, kita pakai CASE WHEN lagi: "JIKA angkanya 'two', MAKA ganti jadi 2."
Tapi, komputer mungkin masih lihat kolom itu sebagai "Teks". Kita nggak bisa menjumlahkan teks. Jadi kita keluarkan jurus CAST. Ini kayak money changer. Kita bilang: "Hei SQL, tolong CAST (TUKAR) kolom ini dari Teks menjadi Angka (INT64)."
Sekarang, kolom itu jadi angka murni dan siap dihitung.
Jurus 3: Si Detektif Duplikat (ROW_NUMBER + PARTITION BY)
Ini jurus paling canggih. Untuk cari data duplikat (misal, email dan produk yang sama persis), kita pakai Window Function.
Bayangkan data kita itu lintasan lari.
Kita suruh SQL: PARTITION BY email, product_name. Artinya, "Bagi lintasan lari ini jadi lajur-lajur kecil berdasarkan email dan produk yang sama."
Lalu, kita pakai ROW_NUMBER(). Ini adalah juri yang memberi nomor urut 1, 2, 3... ke setiap pesanan di dalam lajur yang sama itu.
Setelah semua dapat nomor, kita tinggal bilang: "Sekarang, saya mau ambil semua data yang nomor urutnya (rn) = 1."
Otomatis, semua data yang nomornya 2, 3, dst. (yang artinya duplikat) akan terbuang. Jenius, kan?
Jurus Terakhir: Arsitek Resep (CTE / WITH)
Nah, semua jurus tadi nggak kita jalankan acak-acakan. Kita susun yang rapi pakai WITH ... AS ....
Ini kayak nulis resep.
- Kita bikin tabel sementara WITH data_bersih AS (...) -> ini resep untuk Jurus 1 dan 2.
- Lalu, kita bikin lagi WITH data_tanpa_duplikat AS (...) -> ini resep Jurus 3 yang bahannya diambil dari data_bersih.
- Terakhir, kita tinggal bilang SELECT * FROM data_tanpa_duplikat.
Hasilnya? Satu query yang rapi, bersih, terstruktur, dan menghasilkan data yang 100% siap dipakai untuk laporan.
Gimana? Ternyata data cleaning itu bukan cuma 'bersih-bersih', tapi kayak memecahkan teka-teki logika yang seru banget. Coba deh kamu cari data yang berantakan, terus pakai jurus-jurus ini!"