SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

6 Cara Memilih Baris Duplikat di SQLite

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 3  

Ini 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 dengan DELETE 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 Dog 

Bagaimana 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 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Saya tidak dapat mengatur banyak gambar dalam tampilan kisi?

  2. tutorial otentikasi sidik jari USB biometrik android

  3. Cara Memeriksa apakah Tabel Ada di SQLite

  4. Tutorial SQLite:Semua yang Perlu Anda Ketahui

  5. Wildcard Android SQLite