MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

4 Möglichkeiten, doppelte Zeilen in MariaDB auszuwählen

Wenn Sie eine Tabelle haben, von der Sie vermuten, dass sie doppelte Zeilen in Ihrer MariaDB-Datenbank enthält, können Sie eine der folgenden Abfragen verwenden, um eine Vorstellung davon zu bekommen, wie viele Zeilen Duplikate sind.

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.

Möglichkeit 1

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

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

Ergebnis:

+---------+---------+
| PetId   | Count   |
|---------+---------|
| 1       | 2       |
| 2       | 1       |
| 3       | 1       |
| 4       | 3       |
+---------+---------+

Wir können SELECT erweitern Liste, um bei Bedarf weitere Spalten aufzunehmen:

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 |
|     3 | Tweet   | Bird    |     1 |
|     2 | Scratch | Cat     |     1 |
+-------+---------+---------+-------+

Option 2

Wenn nur die doppelten Zeilen aufgelistet werden sollen, können wir das den HAVING verwenden -Klausel zum Ausschließen nicht doppelter Zeilen:

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 |
+-------+---------+---------+-------+

Möglichkeit 3

Eine andere Möglichkeit ist die Verwendung von ROW_NUMBER() Funktion mit dem PARTITION BY -Klausel, um die Ausgabe der Ergebnismenge zu nummerieren.

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

Um nur die überschüssigen Zeilen aus den übereinstimmenden Duplikaten zurückzugeben, können wir die obige Abfrage wie folgt als allgemeinen Tabellenausdruck verwenden:

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 |
+-------+---------+---------+------------+