sql >> Databáze >  >> RDS >> PostgreSQL

4 způsoby, jak vybrat duplicitní řádky v PostgreSQL

Pokud máte tabulku s duplicitními řádky v PostgreSQL, můžete použít kterýkoli z následujících dotazů k vrácení duplicitních řádků.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT * FROM Pets;

Výsledek:

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

První dva řádky jsou duplikáty a poslední tři řádky jsou duplikáty. Je to proto, že všechny tři sloupce obsahují stejné hodnoty v každém duplicitním řádku.

Možnost 1

Můžeme použít následující dotaz, abychom viděli, kolik řádků je duplicitních:

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

Výsledek:

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

Alternativně jej můžeme seřadit podle počtu v sestupném pořadí, takže řádky s největším počtem duplikátů se zobrazí jako první:

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

Výsledek:

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

Možnost 2

Můžeme použít HAVING klauzule, pokud chceme, aby byly uvedeny pouze duplicitní řádky:

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

Výsledek:

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

Možnost 3

Další možností je použít ROW_NUMBER() Postgresu funkce okna:

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

Výsledek:

 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 klauzule rozděluje sadu výsledků vytvořenou FROM klauzule do oddílů, na které je funkce aplikována. Když určíme oddíly pro sadu výsledků, každý oddíl způsobí, že číslování začne znovu (tj. číslování začne na 1 pro první řádek v každém oddílu).

Možnost 4

Výše uvedený dotaz můžeme použít jako společný tabulkový výraz k vrácení pouze přebytečných řádků z odpovídajících duplikátů:

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;

Výsledek:

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

  1. Použití ODBC se Salesforce a Azure Active Directory (AD) Single Sign On (SSO)

  2. Refaktorujte funkci PL/pgSQL, abyste vrátili výstup různých SELECT dotazů

  3. MySQL AUTO_INCREMENT se nevrací

  4. PostgreSQL:jak převést z epochy Unixu na datum?