Artikel

Konten contoh

SQL untuk Membersihkan Data Transaksi

Rapikan identifier kosong, pilih revisi transaksi secara deterministik, lalu cocokkan jumlah baris penolakan.

Penulis: alfianh.id (identitas pratinjau)Pemula2 menit bacaTerbit:

Konten, data, dan tanggal ini merupakan contoh untuk pratinjau situs.

English

Ikuti artikel melalui RSS

Ukuran teks bacaan18px

Buka simpanan / perbaiki data

Simpanan dan ukuran teks hanya untuk browser ini. Tidak ada sinkronisasi antarperangkat.

Baris transaksi mentah melewati normalisasi dan pemeringkatan sebelum diterima
Baris transaksi mentah melewati normalisasi dan pemeringkatan sebelum diterima
Daftar isi

Ini artikel contoh untuk pembelajaran. Tanggal publikasi dan catatan transaksi bersifat ilustratif.

Toko contoh mengirim transaksi yang sama dua kali setelah percobaan ulang. Baris lain berisi spasi pada kolom identifier. Sebelum menghitung total harian, tentukan baris yang mewakili keadaan transaksi terkini.

Tetapkan kontrak data

Contoh memakai PostgreSQL 18 dengan amount numerik dan timestamp bertipe waktu. Setiap baris mentah punya ingest_id unik yang meningkat. transaction_id menandai satu transaksi. updated_at lebih baru menggantikan versi lama; jika waktunya sama, ingest_id terbesar menang. Periksa arti revisi pada sumber sebelum memakai aturan ini.

Identifier mentahAmountKeputusan
T-10125.00Simpan jika revisi terbaru
T-10130.00Gantikan revisi sebelumnya
hanya spasi20.00Tolak identifier kosong
T-11nullTolak amount kosong

Normalisasi sebelum memberi peringkat

WITH normalized AS (
  SELECT NULLIF(btrim(transaction_id), '') AS transaction_id,
         amount, updated_at, ingest_id
  FROM raw_transactions
), ranked AS (
  SELECT *, row_number() OVER (
    PARTITION BY transaction_id
    ORDER BY updated_at DESC NULLS LAST, ingest_id DESC
  ) AS position
  FROM normalized
  WHERE transaction_id IS NOT NULL
)
SELECT transaction_id, amount
FROM ranked
WHERE position = 1 AND amount IS NOT NULL;

NULLIF mengubah string kosong setelah pemangkasan menjadi null SQL. Fungsi window memberi posisi tanpa menggabungkan baris. ingest_id memecahkan nilai waktu yang seri sehingga pilihan dapat diulang. NULLS LAST menempatkan waktu kosong setelah waktu yang diketahui.

Pemeriksaan amount dilakukan setelah pemilihan revisi terbaru. Jika dilakukan lebih awal, query dapat menghidupkan kembali nilai lama tanpa diketahui. Nilai negatif tetap diterima karena toko contoh mengizinkan pengembalian dana. Sumber lain mungkin membutuhkan aturan berbeda.

Cocokkan jumlah baris

Simpan data mentah dan tabel penolakan berisi ingest_id serta alasan. Hitung identifier kosong, revisi tergantikan, pemenang tidak valid, dan pemenang diterima sebagai kelompok terpisah. Jumlahnya harus sama dengan jumlah baris mentah. Jalankan ulang input yang sama dan bandingkan baris hasil, bukan hanya total: dua kesalahan dapat saling meniadakan.

Query ini mengajarkan pembersihan data. Konversi mata uang, angka teks rusak, dan koreksi terlambat memerlukan kontrak terpisah. Rujukan di bawah menjelaskan urutan window dan NULLIF.

Referensi