sql >> Database teknologi >  >> RDS >> PostgreSQL

4 måder at vælge duplikerede rækker i PostgreSQL

Hvis du har en tabel med dublerede rækker i PostgreSQL, kan du bruge en af ​​følgende forespørgsler til at returnere de duplikerede rækker.

Eksempeldata

Antag, at vi har en tabel med følgende data:

SELECT * FROM Pets;

Resultat:

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

De første to rækker er dubletter, og de sidste tre rækker er dubletter. Det skyldes, at alle tre kolonner indeholder de samme værdier i hver dubletrække.

Valgmulighed 1

Vi kan bruge følgende forespørgsel til at se, hvor mange rækker der er dubletter:

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

Resultat:

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

Vi kan alternativt bestille det efter antal i faldende rækkefølge, så rækkerne med flest dubletter vises først:

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

Resultat:

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

Valgmulighed 2

Vi kan bruge koden HAVING klausul, hvis vi kun vil have de duplikerede rækker anført:

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

Resultat:

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

Valgmulighed 3

En anden mulighed er at bruge Postgres's ROW_NUMBER() vinduesfunktion:

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

Resultat:

 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 klausul deler resultatsættet produceret af FROM klausul i partitioner, som funktionen anvendes på. Når vi angiver partitioner for resultatsættet, får hver partition nummereringen til at starte forfra (dvs. nummereringen starter ved 1 for den første række i hver partition).

Valgmulighed 4

Vi kan bruge ovenstående forespørgsel som et almindeligt tabeludtryk til kun at returnere de overskydende rækker fra de matchende dubletter:

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;

Resultat:

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

  1. Find ikke-ASCII-tegn i varchar-kolonner ved hjælp af SQL Server

  2. Sådan fungerer TO_BASE64()-funktionen i MySQL

  3. MariaDB sammensatte dato- og tidsenheder forklaret

  4. Sådan bruges ora_hash på en kolonne med datatype xmltype