Clickhouse: Cláusula DISTINCT

Cláusula DISTINCT
Se SELECT DISTINCTfor especificado, somente linhas únicas permanecerão em um resultado de consulta. Assim, somente uma única linha permanecerá de todos os conjuntos de linhas totalmente correspondentes no resultado.

Você pode especificar a lista de colunas que devem ter valores exclusivos: SELECT DISTINCT ON (column1, column2,...). Se as colunas não forem especificadas, todas elas 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 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 suporta o uso das cláusulas DISTINCT and ORDER BY para colunas diferentes em uma consulta. Acláusula DISTINCT é executada antes da cláusula ORDER BY.

Considere a tabela:

┌─a─┬─b─┐
│   2   │  1   │
│   1   │  2   │
│   3   │  3   │
│   2   │  4   │
└─-─┴───┘

Selecionando dados:

SELECT DISTINCT a FROM t1 ORDER BY b ASC;

┌─a─┐
│   2   │
│   1   │
│   3   │
└───┘

Selecionando dados com diferentes direções de classificação:

SELECT DISTINCT a FROM t1 ORDER BY b DESC;

A linha com os valores "2 , 4" foi cortada antes da classificação.

Leve essa especificidade de implementação em consideração ao programar consultas.


NULL

O DISTINCT trabalha com NULL como se NULL fosse um valor específico, e NULL==NULL. Em outras palavras, nos DISTINCT resultados, diferentes combinações com NULL ocorrem apenas uma vez. Difere do NULL processamento na maioria dos outros contextos.

É possível obter o mesmo resultado aplicando GROUP BY no mesmo conjunto de valores conforme especificado na cláusula SELECT, sem usar nenhuma função de agregação. Mas há poucas diferenças da abordagem GROUP BY:

 

DISTINCT pode ser aplicado junto com GROUP BY.

Quando ORDER BY é omitido e LIMIT é definido, a consulta para de ser executada imediatamente após o número necessário de linhas diferentes ter sido lido.
Os blocos de dados são gerados à medida que são processados, sem esperar que a consulta inteira termine de ser executada.

DISTINCT Clause. Clickhouse.com. Disponível em:
https://clickhouse.com/docs/en/sql-reference/statements/select/distinct. Acesso em: 05 Jan 2024.


 

Data de Publicação: 26-08-2024

Categoria: Clickhouse