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 mentah | Amount | Keputusan |
|---|---|---|
| T-10 | 125.00 | Simpan jika revisi terbaru |
| T-10 | 130.00 | Gantikan revisi sebelumnya |
| hanya spasi | 20.00 | Tolak identifier kosong |
| T-11 | null | Tolak 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.