PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

4 sposoby na wybranie zduplikowanych wierszy w PostgreSQL

Jeśli masz tabelę ze zduplikowanymi wierszami w PostgreSQL, możesz użyć dowolnego z poniższych zapytań, aby zwrócić zduplikowane wiersze.

Przykładowe dane

Załóżmy, że mamy tabelę z następującymi danymi:

SELECT * FROM Pets;

Wynik:

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

Pierwsze dwa wiersze są duplikatami, a ostatnie trzy wiersze są duplikatami. Dzieje się tak, ponieważ wszystkie trzy kolumny zawierają te same wartości w każdym zduplikowanym wierszu.

Opcja 1

Możemy użyć następującego zapytania, aby zobaczyć, ile wierszy jest duplikatami:

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

Wynik:

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

Alternatywnie możemy uporządkować to według liczby w porządku malejącym, tak aby wiersze z największą liczbą duplikatów pojawiły się jako pierwsze:

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

Wynik:

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

Opcja 2

Możemy użyć HAVING klauzula, jeśli chcemy wyświetlić tylko zduplikowane wiersze:

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

Wynik:

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

Opcja 3

Inną opcją jest użycie ROW_NUMBER() Postgresa funkcja okna:

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

Wynik:

 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 klauzula dzieli zbiór wyników utworzony przez FROM klauzuli na przegrody, do których funkcja jest stosowana. Kiedy określamy partycje dla zestawu wyników, każda partycja powoduje, że numeracja zaczyna się od nowa (tj. numeracja rozpocznie się od 1 dla pierwszego wiersza w każdej partycji).

Opcja 4

Możemy użyć powyższego zapytania jako wspólnego wyrażenia tabelowego, aby zwrócić tylko nadwyżki wierszy z pasujących duplikatów:

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;

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. W jaki sposób search_path wpływa na rozpoznawanie identyfikatora i bieżący schemat?

  2. Aplikacja Spring Boot blokuje się na Hikari-Pool-1 - Uruchamianie...

  3. Zapytanie PostgreSQL za pomocą Npgsql i Entity Framework przy użyciu nieakcentu

  4. Jak przekonwertować ciąg na wartość liczbową w PostgreSQL

  5. Pobierz ostatni dzień miesiąca w PostgreSQL