Hay 4 métodos que puede utilizar:
- DISTINTO
- AGRUPAR POR
- Subconsulta
- Expresión de tabla común (CTE) con ROW_NUMBER ()
Considere la siguiente muestra TABLE
con datos de prueba:
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);
Opción 1: SELECT DISTINCT
Esta es la forma más simple y directa, pero también la más limitada:
SELECT DISTINCT word, num
FROM dupes
ORDER BY word, num;
Opción 2: AGRUPAR POR
Agrupación le permite añadir los datos agregados, como el min(id)
, max(id)
, count(*)
, etc:
SELECT word, num, min(id), max(id), count(*)
FROM dupes
GROUP BY word, num
ORDER BY word, num;
Opción 3: subconsulta
Con una subconsulta, primero puede identificar las filas duplicadas para ignorarlas y luego filtrarlas en la consulta externa con la WHERE NOT IN (subquery)
construcción:
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;
Opción 4: Expresión de tabla común con ROW_NUMBER ()
En Common Table Expression (CTE), seleccione ROW_NUMBER (), dividido por la columna de grupo y ordenado en el orden deseado. Luego SELECCIONE solo los registros que tienen 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;