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