Saltar al contenido principal
Si se especifica SELECT DISTINCT, en el resultado de una consulta solo permanecerán las filas únicas. Es decir, de cada conjunto de filas completamente idénticas en el resultado, solo permanecerá una. Puede especificar la lista de columnas que deben tener valores únicos: SELECT DISTINCT ON (column1, column2,...). Si no se especifican las columnas, se tendrán en cuenta todas. Considere la tabla:
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
Usar DISTINCT sin especificar columnas:
SELECT DISTINCT * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
Uso de DISTINCT con columnas específicas:
SELECT DISTINCT ON (a,b) * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘

DISTINCT y ORDER BY

ClickHouse permite usar las cláusulas DISTINCT y ORDER BY para columnas diferentes en una misma consulta. La cláusula DISTINCT se ejecuta antes que la cláusula ORDER BY. Considere la tabla:
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘
Selección de datos:
SELECT DISTINCT a FROM t1 ORDER BY b ASC;
┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘
Selección de datos con diferentes direcciones de ordenación:
SELECT DISTINCT a FROM t1 ORDER BY b DESC;
┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘
La fila 2, 4 se truncó antes de ordenar. Tenga en cuenta esta particularidad de la implementación al escribir consultas.

Tratamiento de NULL

DISTINCT funciona con NULL como si NULL fuera un valor específico y NULL==NULL. En otras palabras, en los resultados de DISTINCT, las distintas combinaciones con NULL aparecen solo una vez. Esto difiere del tratamiento de NULL en la mayoría de los demás contextos.

Alternativas

Es posible obtener el mismo resultado aplicando GROUP BY al mismo conjunto de valores especificado en la cláusula SELECT, sin usar ninguna función de agregación. Sin embargo, hay algunas diferencias con respecto al enfoque de GROUP BY:
  • DISTINCT se puede aplicar junto con GROUP BY.
  • Cuando se omite ORDER BY y se define LIMIT, la consulta deja de ejecutarse inmediatamente después de leer el número requerido de filas distintas.
  • Los bloques de datos se generan a medida que se procesan, sin esperar a que toda la consulta termine de ejecutarse.
Última modificación el 10 de junio de 2026