sql >> Databasteknik >  >> RDS >> PostgreSQL

4 sätt att välja dubbletter av rader i PostgreSQL

Om du har en tabell med dubblettrader i PostgreSQL kan du använda någon av följande frågor för att returnera dubblettraderna.

Exempeldata

Anta att vi har en tabell med följande 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 två första raderna är dubbletter och de sista tre raderna är dubbletter. Det beror på att alla tre kolumnerna innehåller samma värden i varje dubblettrad.

Alternativ 1

Vi kan använda följande fråga för att se hur många rader som är dubbletter:

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 sortera efter antal i fallande ordning, så att raderna med flest dubbletter visas 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

Alternativ 2

Vi kan använda koden HAVING om vi bara vill ha dubblettraderna listade:

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

Alternativ 3

Ett annat alternativ är att använda Postgress ROW_NUMBER() fönsterfunktion:

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 satsen delar resultatuppsättningen som produceras av FROM sats i partitioner som funktionen tillämpas på. När vi anger partitioner för resultatuppsättningen, gör varje partition att numreringen börjar om igen (dvs. numreringen börjar på 1 för den första raden i varje partition).

Alternativ 4

Vi kan använda ovanstående fråga som ett vanligt tabelluttryck för att bara returnera överskottsraderna från matchande dubbletter:

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. Databasmodeller för e-handel Del 1:Nyhetsbrevet

  2. Vad är användningen av SQL GROUP BY-uttalande?

  3. Lägg till ledande och efterföljande nollor i SQL Server

  4. Hur upprätthåller PostgreSQL den UNIKA begränsningen / vilken typ av index använder den?