Existem 4 métodos que você pode usar:
- DISTINTO
- GRUPO POR
- Subconsulta
- Expressão de tabela comum (CTE) com ROW_NUMBER ()
Considere o seguinte exemplo TABLE
com dados de teste:
CREATE TEMPORARY TABLE dupes(word text, num int, id int);
INSERT INTO dupes(word, num, id)
VALUES ('aaa', 100, 1)
,('bbb', 200, 2)
,('ccc', 300, 3)
,('bbb', 400, 4)
,('bbb', 200, 5)
,('ccc', 300, 6)
,('ddd', 400, 7)
,('bbb', 400, 8)
,('aaa', 100, 9)
,('ccc', 300, 10);
Opção 1: SELECIONE DISTINTO
Esta é a maneira mais simples e direta, mas também a mais limitada:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Opção 2: GROUP BY
Agrupamento permite que você adicione dados agregados, como o min(id)
, max(id)
, count(*)
, etc:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Opção 3: subconsulta
Usando uma subconsulta, você pode primeiro identificar as linhas duplicadas a serem ignoradas e, em seguida, filtrá-las na consulta externa com a WHERE NOT IN (subquery)
construção:
SELECT distinct d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
SELECT *
FROM dupes
WHERE id NOT IN (
SELECT d2.id
FROM dupes d1
INNER JOIN dupes d2 ON d2.word=d1.word AND d2.num=d1.num
WHERE d2.id > d1.id
)
ORDER BY word, num;
Opção 4: Expressão de tabela comum com ROW_NUMBER ()
Na Expressão de Tabela Comum (CTE), selecione ROW_NUMBER (), particionado pela coluna do grupo e ordenado na ordem desejada. Em seguida, SELECIONE apenas os registros que possuem ROW_NUMBER() = 1
:
WITH CTE AS (
SELECT *
,row_number() OVER(PARTITION BY word, num ORDER BY id) AS row_num
FROM dupes
)
SELECT word, num, id
FROM cte
WHERE row_num = 1
ORDER BY word, num;