Kueri berikut dapat digunakan untuk mengembalikan baris duplikat di SQLite.
Di sini, baris duplikat berisi nilai duplikat di semua kolom, termasuk kolom ID.
Contoh Data
Misalkan kita memiliki tabel dengan data berikut:
SELECT * FROM Pets;
Hasil:
PetId PetName PetType----- ------- -------1 Mengibas Anjing 1 Mengibas Anjing 2 Kucing Menggaruk 3 Tweet Burung 4 Anjing Menggonggong 4 Anjing Menggonggong 4 Anjing Menggonggong
Dua baris pertama adalah duplikat, seperti juga tiga baris terakhir. Itu karena ketiga kolom berisi nilai yang sama di setiap baris duplikat.
Opsi 1
Kita dapat menggunakan kueri berikut untuk melihat berapa banyak baris yang merupakan duplikat:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY PetId;
Hasil:
PetId PetName PetType Hitungan----- ------- ------- -----1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Bark Dog 3
Di sini, kami mengelompokkan baris menurut semua kolom, dan mengembalikan jumlah baris setiap grup. Ini memberi tahu kita apakah baris itu unik (dengan hitungan 1) atau duplikat (dengan hitungan lebih besar dari 1).
Kita bisa mengurutkannya dengan cara hitung dalam urutan menurun, sehingga baris dengan duplikat terbanyak muncul lebih dulu:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
ORDER BY Count(*) DESC;
Hasil:
PetId PetName PetType Hitungan----- ------- ------- -----4 Bark Dog 3 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1
Opsi 2
Jika kita hanya ingin baris duplikat yang terdaftar, kita dapat menggunakan HAVING
klausa untuk mengembalikan hanya baris dengan hitungan lebih besar dari 1:
SELECT
PetId,
PetName,
PetType,
COUNT(*) AS "Count"
FROM Pets
GROUP BY
PetId,
PetName,
PetType
HAVING COUNT(*) > 1
ORDER BY PetId;
Hasil:
PetId PetName PetType Hitungan----- ------- ------- -----1 Wag Dog 2 4 Bark Dog 3
Opsi 3
Opsi lainnya adalah menggunakan ROW_NUMBER()
fungsi jendela:
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets;
Hasil:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 1 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Burung 1 4 Anjing Menggonggong 1 4 Anjing Menggonggong 2 4 Anjing Menggonggong 3
PARTITION BY
klausa membagi set hasil yang dihasilkan oleh FROM
klausa ke dalam partisi tempat fungsi diterapkan. Saat kita menentukan partisi untuk kumpulan hasil, setiap partisi menyebabkan penomoran dimulai dari awal lagi (yaitu penomoran akan dimulai dari 1 untuk baris pertama di setiap partisi).
Opsi 4
Kita dapat menggunakan kueri di atas sebagai ekspresi tabel umum:
WITH cte AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY PetId, PetName, PetType
ORDER BY PetId, PetName, PetType
) AS Row_Number
FROM Pets
)
SELECT * FROM cte WHERE Row_Number <> 1;
Hasil:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 2 4 Bark Dog 2 4 Bark Dog 3Ini mengembalikan hanya kelebihan baris dari duplikat yang cocok. Jadi jika ada dua baris yang identik, ia mengembalikan salah satunya. Jika ada tiga baris yang identik, ia mengembalikan dua, dan seterusnya.
Kueri ini dapat berguna untuk memperlihatkan berapa banyak baris yang akan dihapus dari tabel dalam operasi de-duping. Di beberapa DBMS lain (setidaknya di SQL Server), kita dapat mengganti
SELECT *
. yang terakhir denganDELETE
untuk menghapus baris duplikat dari tabel. Tetapi SQLite tidak mengizinkan kami memperbarui CTE seperti itu.Untungnya, dua opsi berikutnya dapat dimodifikasi untuk melakukan penghapusan.
Opsi 5
Kita dapat memanfaatkan
rowid
SQLite :SELECT * FROM Pets WHERE EXISTS ( SELECT 1 FROM Pets p2 WHERE Pets.PetName = p2.PetName AND Pets.PetType = p2.PetType AND Pets.rowid > p2.rowid );
Hasil:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Bark Dog 4 Bark DogBagaimana cara kerjanya? Secara default, setiap baris dalam SQLite memiliki kolom khusus, biasanya disebut
rowid
, yang secara unik mengidentifikasi baris tersebut di dalam tabel. Ini dapat dihapus jika diperlukan, tetapi kecuali telah dihapus secara eksplisit, Anda akan dapat memanfaatkannya dalam kueri Anda.Opsi 6
Dan akhirnya, inilah opsi lain yang menggunakan
rowid
SQLite :SELECT * FROM Pets WHERE rowid > ( SELECT MIN(rowid) FROM Pets p2 WHERE Pets.PetName = p2.PetName AND Pets.PetType = p2.PetType );
Hasil:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Bark Dog 4 Bark Dog