Check Duplicate
Check Duplicate Multiple Table
WITH RankedTempLeads AS (
SELECT
t.*,
ROW_NUMBER() OVER (PARTITION BY t.phone ORDER BY t.timestamp ASC) AS row_num
FROM public.temp_leads t
WHERE NOT EXISTS (
SELECT 1
FROM public.leads l
WHERE l.phone = t.phone
)
AND NOT EXISTS (
SELECT 1
FROM public.family f
WHERE f.family_phone = t.phone
)
AND t.phone IS NOT NULL
)
SELECT *
FROM RankedTempLeads
WHERE row_num = 1
ORDER BY phone ASC;WITH RankedTempLeads AS (
SELECT
t.*,
ROW_NUMBER() OVER (PARTITION BY t.phone ORDER BY t.created_at ASC) AS row_num
FROM public.sleekflow t
WHERE NOT EXISTS (
SELECT 1
FROM public.combined l
WHERE l.phone = t.phone
)
AND t.phone IS NOT NULL
)
SELECT *
FROM RankedTempLeads
WHERE row_num = 1
ORDER BY phone ASC;1. Bagian "WITH RankedTempLeads AS (...)"
Bagian ini membuat temporary table bernama RankedTempLeads yang berisi data dari tabel temp_leads, tetapi hanya data tertentu yang memenuhi syarat. Berikut penjelasannya:
a. Kolom Tambahan
ROW_NUMBER() OVER (PARTITION BY t.phone ORDER BY t.timestamp ASC) AS row_numMenambahkan kolom bernamarow_num, yang memberikan nomor urut untuk setiap group berdasarkan nilait.phone.Pengelompokan dilakukan menggunakan
PARTITION BY t.phone(artinya data dikelompokkan berdasarkan nomor telepon).Nomor urut ditentukan berdasarkan urutan waktu (
t.timestamp ASC), sehingga data dengan waktu yang paling awal mendapat nomor 1.
b. Syarat "WHERE"
WHERE NOT EXISTS (...): Mengecek apakah datat.phonedaritemp_leadstidak ada di dua tabel lain, yaitu:Tabel
leads(kolomphone).Tabel
family(kolomfamily_phone).
Jika
t.phoneditemukan di salah satu tabel tersebut, maka data tersebut akan diabaikan.AND t.phone IS NOT NULL: Memastikan nomor telepon (t.phone) tidak kosong/null.
Hasilnya adalah temporary table RankedTempLeads yang hanya berisi data nomor telepon yang:
Tidak ada di tabel
leadsdanfamily.Nomor teleponnya tidak kosong.
2. Bagian "SELECT * FROM RankedTempLeads WHERE row_num = 1"
Bagian ini memilih data dari temporary table RankedTempLeads, tetapi hanya baris dengan row_num = 1.
Artinya, hanya data dengan waktu terawal (
timestamppaling kecil) untuk setiap nomor telepon yang akan diambil.
3. Bagian "ORDER BY phone ASC"
Hasil akhir diurutkan berdasarkan nomor telepon (phone) dalam urutan naik (ascending order).
Kesimpulan Fungsi Query
Query ini digunakan untuk:
Mengambil data nomor telepon dari tabel
temp_leadsyang tidak ada di tabelleadsdanfamily.Memastikan hanya nomor telepon yang tidak kosong yang diproses.
Dari setiap nomor telepon, hanya memilih data dengan waktu terawal (
timestamppaling kecil).Menampilkan hasil dengan urutan nomor telepon secara naik (ASC).
Hasil akhir adalah daftar unik nomor telepon dari temp_leads yang belum ada di tabel leads maupun family, dengan satu baris data per nomor telepon (berdasarkan waktu terawal).
Check Duplicate Single Table
WITH DuplicatePhones AS (
SELECT
phone
FROM
public.leads
GROUP BY
phone
HAVING
COUNT(phone) > 1
)
SELECT
l.*
FROM
public.leads l
INNER JOIN
DuplicatePhones dp
ON
l.phone = dp.phone
-- WHERE leads_qualification IN ('Inbound','Leads')
ORDER BY phone, "timestamp" ASC;1. Bagian WITH DuplicatePhones AS (...)
WITH DuplicatePhones AS (...)Bagian ini membuat temporary table bernama DuplicatePhones yang berisi daftar nomor telepon (phone) dari tabel public.leads yang terdapat lebih dari satu kali (duplikat). Berikut rincian logikanya:
a. SELECT phone
Hanya mengambil kolom
phonedari tabelpublic.leads.
b. GROUP BY phone
Mengelompokkan data berdasarkan kolom
phone, sehingga setiap nomor telepon dikelompokkan menjadi satu grup.
c. HAVING COUNT(phone) > 1
Memfilter grup yang memiliki jumlah (COUNT) lebih dari 1, yaitu nomor telepon yang muncul lebih dari satu kali (duplikat).
Hasil dari bagian ini adalah daftar nomor telepon yang memiliki duplikat di tabel public.leads.
2. Bagian SELECT l.*
SELECT l.*Bagian ini digunakan untuk mengambil semua kolom dari tabel public.leads, tetapi hanya untuk baris yang nomornya termasuk dalam daftar DuplicatePhones. Berikut rincian logikanya:
a. INNER JOIN DuplicatePhones dp
Melakukan inner join antara tabel
public.leads(aliasl) dengan temporary tableDuplicatePhones(aliasdp).Kondisi join:
ON l.phone = dp.phone, artinya hanya data di tabelpublic.leadsyang nomor teleponnya cocok dengan daftar nomor diDuplicatePhonesakan diambil.
b. WHERE leads_qualification IN ('Inbound', 'Leads') (dalam komentar)
Baris ini saat ini dinonaktifkan (commented out), tetapi jika diaktifkan, akan memfilter data lebih lanjut untuk hanya menampilkan baris di mana kolom
leads_qualificationbernilai'Inbound'atau'Leads'.
c. ORDER BY phone, "timestamp" ASC
Mengurutkan hasil akhir berdasarkan:
Nomor telepon (
phone) dalam urutan naik (ascending).Waktu (
timestamp) dalam urutan naik.
Kesimpulan Fungsi Query
Query ini digunakan untuk:
Mendeteksi nomor telepon yang memiliki duplikat di tabel
public.leads(nomor telepon yang muncul lebih dari sekali).Mengambil semua data dari tabel
public.leadsuntuk nomor-nomor telepon tersebut.Mengurutkan hasil berdasarkan nomor telepon dan waktu (
timestamp).
Hasil akhirnya adalah daftar lengkap baris dari tabel public.leads yang memiliki duplikat nomor telepon, diurutkan berdasarkan nomor telepon dan waktu secara naik.
Jika bagian WHERE leads_qualification IN ('Inbound', 'Leads') diaktifkan, maka hanya data dengan leads_qualification tertentu yang akan ditampilkan.
Last updated