Passer au contenu principal
Si SELECT DISTINCT est spécifié, seules les lignes uniques apparaissent dans le résultat d’une requête. Ainsi, parmi chaque ensemble de lignes parfaitement identiques dans le résultat, une seule est conservée. Vous pouvez spécifier la liste des colonnes dont les valeurs doivent être uniques : SELECT DISTINCT ON (column1, column2,...). Si les colonnes ne sont pas spécifiées, elles sont toutes prises en compte. Considérez la table :
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
Utiliser DISTINCT sans spécifier de colonnes :
SELECT DISTINCT * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
Utilisation de DISTINCT avec des colonnes spécifiques :
SELECT DISTINCT ON (a,b) * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘

DISTINCT et ORDER BY

ClickHouse permet d’utiliser les clauses DISTINCT et ORDER BY sur des colonnes différentes dans une même requête. La clause DISTINCT est exécutée avant la clause ORDER BY. Considérons la table :
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘
Sélection de données :
SELECT DISTINCT a FROM t1 ORDER BY b ASC;
┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘
Sélection des données avec un ordre de tri différent :
SELECT DISTINCT a FROM t1 ORDER BY b DESC;
┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘
La ligne 2, 4 a été tronquée avant le tri. Tenez compte de cette spécificité d’implémentation lors de l’écriture de requêtes.

Traitement de NULL

DISTINCT traite NULL comme si NULL était une valeur spécifique, et NULL==NULL. Autrement dit, dans les résultats de DISTINCT, les différentes combinaisons avec NULL n’apparaissent qu’une seule fois. Cela diffère du traitement de NULL dans la plupart des autres contextes.

Alternatives

Il est possible d’obtenir le même résultat en appliquant GROUP BY sur le même ensemble de valeurs que celui spécifié dans la clause SELECT, sans utiliser de fonctions d’agrégation. Mais il existe quelques différences par rapport à l’approche GROUP BY :
  • DISTINCT peut être appliqué conjointement avec GROUP BY.
  • Lorsque ORDER BY est omis et que LIMIT est défini, la requête s’arrête immédiatement après la lecture du nombre requis de lignes distinctes.
  • Les blocs de données sont affichés au fur et à mesure de leur traitement, sans attendre la fin de l’exécution de la requête.
Dernière modification le 25 juin 2026