メインコンテンツまでスキップ
メインコンテンツまでスキップ

DISTINCT 句

SELECT DISTINCT が指定されている場合、クエリの結果にはユニークな行のみが残ります。したがって、結果内の完全に一致する行のセットからは1つの行のみが残ります。

ユニークな値を持つ必要があるカラムのリストを指定することができます: SELECT DISTINCT ON (column1, column2,...)。カラムが指定されていない場合、すべてのカラムが考慮されます。

テーブルを考えてみましょう:

カラムを指定せずに DISTINCT を使用する場合:

指定したカラムで DISTINCT を使用する場合:

DISTINCT と ORDER BY

ClickHouse は、DISTINCTORDER BY 句を異なるカラムに対して1つのクエリで使用することをサポートしています。DISTINCT 句は、ORDER BY 句の前に実行されます。

テーブルを考えてみましょう:

データを選択する場合:

異なるソート方向でデータを選択する場合:

2, 4 はソートの前にカットされました。

クエリをプログラミングする際にはこの実装の仕様を考慮してください。

NULL 処理

DISTINCT は、NULL が特定の値として扱われ、NULL==NULL のように動作します。言い換えれば、DISTINCT の結果では、NULL を含む異なる組み合わせが1回だけ発生します。これは他のほとんどの文脈における NULL 処理とは異なります。

代替手段

同じ結果を得るために、集約関数を使用せずに SELECT 句で指定された同じ値のセットに対して GROUP BY を適用することもできます。しかし、GROUP BY アプローチにはいくつかの違いがあります:

  • DISTINCTGROUP BY と一緒に適用できます。
  • ORDER BY が省略され、LIMIT が定義されている場合、クエリは必要な異なる行の数が読み取られた後、すぐに実行が停止します。
  • データブロックは、クエリ全体が完了するのを待つことなく、処理されるとすぐに出力されます。