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