Vous pouvez utiliser 4 méthodes:
- DISTINCT
- PAR GROUPE
- Sous-requête
- Expression de table commune (CTE) avec ROW_NUMBER ()
Considérez l'exemple suivant TABLE
avec les données de 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);
Option 1: SELECT DISTINCT
C'est le moyen le plus simple et le plus direct, mais aussi le plus limité:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Option 2: GROUP BY
Regroupement vous permet d'ajouter des données agrégées, comme min(id)
, max(id)
, count(*)
, etc:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Option 3: sous-requête
À l'aide d'une sous-requête, vous pouvez d'abord identifier les lignes dupliquées à ignorer, puis les filtrer dans la requête externe avec la WHERE NOT IN (subquery)
construction:
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;
Option 4: Expression de table commune avec ROW_NUMBER ()
Dans l'expression de table commune (CTE), sélectionnez le ROW_NUMBER (), partitionné par la colonne de groupe et ordonné dans l'ordre souhaité. Sélectionnez ensuite uniquement les enregistrements qui ont 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;