Ci sono 4 metodi che puoi usare:
- DISTINTO
- RAGGRUPPA PER
- Sottoquery
- Common Table Expression (CTE) con ROW_NUMBER ()
Considera il seguente esempio TABLE
con i dati del test:
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);
Opzione 1: SELEZIONA DISTINTO
Questo è il modo più semplice e diretto, ma anche il più limitato:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Opzione 2: GROUP BY
Il raggruppamento consente di aggiungere dati aggregati, come il min(id)
, max(id)
, count(*)
, ecc:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Opzione 3: sottoquery
Utilizzando una sottoquery, puoi prima identificare le righe duplicate da ignorare e quindi filtrarle nella query esterna con il WHERE NOT IN (subquery)
costrutto:
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;
Opzione 4: espressione di tabella comune con ROW_NUMBER ()
In Common Table Expression (CTE), selezionare ROW_NUMBER (), partizionato dalla colonna del gruppo e ordinato nell'ordine desiderato. Quindi SELEZIONA solo i record che hanno 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;