DISTINCT句
SELECT DISTINCTが指定されている場合、クエリ結果にはユニークな行だけが残ります。つまり、結果内で完全に一致する行のセットからは、単一の行のみが残ります。
ユニークな値を持つべきカラムのリストを指定できます: SELECT DISTINCT ON (column1, column2,...)。カラムが指定されていない場合は、すべてが考慮されます。
以下のテーブルを考えてみましょう:
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
カラムを指定せずにDISTINCTを使用する場合:
SELECT DISTINCT * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 1 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
カラムを指定してDISTINCTを使用する場合:
SELECT DISTINCT ON (a,b) * FROM t1;
┌─a─┬─b─┬─c─┐
│ 1 │ 1 │ 1 │
│ 2 │ 2 │ 2 │
│ 1 │ 2 │ 2 │
└───┴───┴───┘
DISTINCTとORDER BY
ClickHouseは、異なるカラムに対してDISTINCTおよびORDER BY句を使用することをサポートしています。DISTINCT句はORDER BY句よりも先に実行されます。
以下のテーブルを考えてみましょう:
┌─a─┬─b─┐
│ 2 │ 1 │
│ 1 │ 2 │
│ 3 │ 3 │
│ 2 │ 4 │
└───┴───┘
データを選択する場合:
SELECT DISTINCT a FROM t1 ORDER BY b ASC;
┌─a─┐
│ 2 │
│ 1 │
│ 3 │
└───┘
異なるソート順でデータを選択する場合:
SELECT DISTINCT a FROM t1 ORDER BY b DESC;
┌─a─┐
│ 3 │
│ 1 │
│ 2 │
└───┘
行2, 4はソートの前にカットされました。
クエリをプログラムするときには、この実装の特性に注意してください。
NULLの処理
DISTINCTは、NULLを特定の値とみなして処理し、NULL==NULLであるかのように動作します。言い換えれば、DISTINCTの結果では、NULLとの異なる組み合わせは一度だけ発生します。他の多くの文脈におけるNULLの処理とは異なります。
代替案
SELECT句で指定した同じ値のセットに対してGROUP BYを適用することで、集計関数を使用せずに同じ結果を得ることができます。しかし、GROUP BYアプローチとはいくつかの違いがあります: