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

DISTINCT句

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

一意の値を持つ必要があるカラムのリストを指定できます: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は、1つのクエリ内で異なるカラムに対してDISTINCTORDER 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を含む異なる組み合わせは1回だけ発生します。これは、ほとんどの他のコンテキストでのNULL処理とは異なります。

代替案

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

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