Se SELECT DISTINCT for especificado, apenas linhas únicas permanecerão no resultado da consulta. Assim, de cada conjunto de linhas totalmente idênticas no resultado, apenas uma linha será mantida.
Você pode especificar a lista de colunas que devem ter valores únicos: SELECT DISTINCT ON (column1, column2,...). Se as colunas não forem especificadas, todas serão levadas em consideração.
Considere a tabela:
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘Usando DISTINCT sem especificar colunas:
SELECT DISTINCT * FROM t1;┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘Usando DISTINCT com as colunas especificadas:
SELECT DISTINCT ON (a,b) * FROM t1;┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘DISTINCT e ORDER BY
O ClickHouse permite usar as cláusulas DISTINCT e ORDER BY para colunas diferentes em uma mesma consulta. A cláusula DISTINCT é executada antes da cláusula ORDER BY.
Considere a tabela:
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘Seleção de dados:
SELECT DISTINCT a FROM t1 ORDER BY b ASC;┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘Selecionando dados com uma direção de ordenação diferente:
SELECT DISTINCT a FROM t1 ORDER BY b DESC;┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘A linha 2, 4 foi descartada antes da ordenação.
Leve essa particularidade da implementação em conta ao escrever consultas.
Processamento de NULL
DISTINCT funciona com NULL como se NULL fosse um valor específico e NULL==NULL. Em outras palavras, nos resultados de DISTINCT, diferentes combinações com NULL aparecem apenas uma vez. Isso difere do processamento de NULL na maioria dos outros contextos.
Alternativas
É possível obter o mesmo resultado aplicando GROUP BY ao mesmo conjunto de valores especificado na cláusula SELECT, sem usar nenhuma função de agregação. No entanto, há algumas diferenças em relação à abordagem com GROUP BY:
DISTINCTpode ser aplicado junto comGROUP BY.- Quando ORDER BY é omitido e LIMIT é definido, a consulta para de ser executada imediatamente após a leitura do número necessário de linhas distintas.
- Os blocos de dados são produzidos à medida que são processados, sem esperar que toda a consulta termine de ser executada.