PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

4 Cara Memilih Baris Duplikat di PostgreSQL

Jika Anda memiliki tabel dengan baris duplikat di PostgreSQL, Anda dapat menggunakan salah satu kueri berikut untuk mengembalikan baris duplikat.

Contoh Data

Misalkan kita memiliki tabel dengan data berikut:

SELECT * FROM Pets;

Hasil:

 petid | petname | pettype 
-------+---------+---------
     1 | Wag     | Dog
     1 | Wag     | Dog
     2 | Scratch | Cat
     3 | Tweet   | Bird
     4 | Bark    | Dog
     4 | Bark    | Dog
     4 | Bark    | Dog

Dua baris pertama adalah duplikat, dan tiga baris terakhir adalah duplikat. 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 | Count 
-------+---------+---------+-------
     1 | Wag     | Dog     |     2
     2 | Scratch | Cat     |     1
     3 | Tweet   | Bird    |     1
     4 | Bark    | Dog     |     3

Sebagai alternatif, kita dapat mengurutkannya dengan menghitung 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 | Count 
-------+---------+---------+-------
     4 | Bark    | Dog     |     3
     1 | Wag     | Dog     |     2
     2 | Scratch | Cat     |     1
     3 | Tweet   | Bird    |     1

Opsi 2

Kita dapat menggunakan HAVING klausa jika kita hanya ingin baris duplikat terdaftar:

SELECT 
    PetId,
    PetName,
    PetType,
    COUNT(*) AS "Count"
FROM Pets
GROUP BY 
    PetId,
    PetName,
    PetType
HAVING COUNT(*) > 1
ORDER BY PetId;

Hasil:

 petid | petname | pettype | Count 
-------+---------+---------+-------
     1 | Wag     | Dog     |     2
     4 | Bark    | Dog     |     3

Opsi 3

Opsi lainnya adalah menggunakan ROW_NUMBER() Postgres 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   | Bird    |          1
     4 | Bark    | Dog     |          1
     4 | Bark    | Dog     |          2
     4 | Bark    | Dog     |          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 untuk mengembalikan hanya baris surplus dari duplikat yang cocok:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MIN() Fungsi di PostgreSQL

  2. Kueri Sub SQL dalam batasan centang

  3. Cara Memantau PostgreSQL Berjalan Di Dalam Wadah Docker:Bagian Kedua

  4. Java - tanggal disimpan sebagai hari sebelumnya

  5. Ekstrak tanggal (yyyy/mm/dd) dari stempel waktu di PostgreSQL