ClickHouse/docs/ja/sql-reference/statements/select/distinct.md
2024-11-18 11:58:58 +09:00

3.3 KiB

slug sidebar_label
/ja/sql-reference/statements/select/distinct DISTINCT

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アプローチとはいくつかの違いがあります:

  • DISTINCTGROUP BYとともに適用できます。
  • ORDER BYが省略され、LIMITが定義されている場合、クエリは必要な異なる行の数を読み取った時点で即座に終了します。
  • データブロックはクエリの実行が完了するのを待たずに処理されるとそのまま出力されます。