メインコンテンツへスキップ
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 つのクエリ内で 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 は、NULLNULL が特定の値であり、NULL==NULL であるかのように扱います。つまり、DISTINCT の結果では、NULL を含む同じ組み合わせは 1 回しか現れません。これは、ほかの多くの文脈での NULL の扱いとは異なります。

代替手段

集約関数を使用しなくても、SELECT 句で指定したものと同じ値の組み合わせに対して GROUP BY を適用すれば、同じ結果を得ることができます。ただし、GROUP BY を使う方法とはいくつか異なる点があります。
  • DISTINCTGROUP BY と組み合わせて使用できます。
  • ORDER BY を省略し、LIMIT を指定した場合、必要な数の異なる行を読み込んだ時点で、クエリは直ちに停止します。
  • データブロックは、クエリ全体の実行が完了するのを待たず、処理されるたびに出力されます。
最終更新日 2026年6月10日