PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

4 Möglichkeiten zum Auswählen doppelter Zeilen in PostgreSQL

Wenn Sie eine Tabelle mit doppelten Zeilen in PostgreSQL haben, können Sie eine der folgenden Abfragen verwenden, um die doppelten Zeilen zurückzugeben.

Beispieldaten

Angenommen, wir haben eine Tabelle mit den folgenden Daten:

SELECT * FROM Pets;

Ergebnis:

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

Die ersten beiden Zeilen sind Duplikate und die letzten drei Zeilen sind Duplikate. Das liegt daran, dass alle drei Spalten in jeder doppelten Zeile dieselben Werte enthalten.

Option 1

Wir können die folgende Abfrage verwenden, um zu sehen, wie viele Zeilen Duplikate sind:

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

Ergebnis:

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

Wir können es alternativ nach Anzahl in absteigender Reihenfolge sortieren, sodass die Zeilen mit den meisten Duplikaten zuerst erscheinen:

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

Ergebnis:

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

Option 2

Wir können den HAVING verwenden -Klausel, wenn nur die doppelten Zeilen aufgelistet werden sollen:

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

Ergebnis:

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

Option 3

Eine weitere Option ist die Verwendung von ROW_NUMBER() von Postgres Fensterfunktion:

SELECT 
    *, 
    ROW_NUMBER() OVER ( 
        PARTITION BY PetId, PetName, PetType 
        ORDER BY PetId, PetName, PetType
        ) AS Row_Number
FROM Pets;

Ergebnis:

 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

Die PARTITION BY -Klausel teilt die von FROM erzeugte Ergebnismenge -Klausel in Partitionen, auf die die Funktion angewendet wird. Wenn wir Partitionen für die Ergebnismenge angeben, bewirkt jede Partition, dass die Nummerierung erneut beginnt (d. h. die Nummerierung beginnt bei 1 für die erste Zeile in jeder Partition).

Option 4

Wir können die obige Abfrage als allgemeinen Tabellenausdruck verwenden, um nur die überschüssigen Zeilen aus den übereinstimmenden Duplikaten zurückzugeben:

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;

Ergebnis:

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