Skip to main content
Skip to main content

Секция DISTINCT

Если указан SELECT DISTINCT, то в результате запроса останутся только уникальные строки. Таким образом, из всех наборов полностью совпадающих строк в результате останется только одна строка.

Вы можете указать столбцы, по которым хотите отбирать уникальные значения: SELECT DISTINCT ON (column1, column2,...). Если столбцы не указаны, то отбираются строки, в которых значения уникальны во всех столбцах.

Рассмотрим таблицу:

Использование DISTINCT без указания столбцов:

Использование DISTINCT с указанием столбцов:

DISTINCT и ORDER BY

ClickHouse поддерживает использование секций DISTINCT и ORDER BY для разных столбцов в одном запросе. Секция DISTINCT выполняется до секции ORDER BY.

Таблица для примера:

При выборе данных с помощью SELECT DISTINCT a FROM t1 ORDER BY b ASC, мы получаем следующий результат:

Если мы изменим направление сортировки SELECT DISTINCT a FROM t1 ORDER BY b DESC, мы получаем следующий результат:

Ряд 2, 4 был разрезан перед сортировкой.

Учитывайте эту специфику при разработке запросов.

Обработка NULL

DISTINCT работает с NULL как будто NULL — обычное значение и NULL==NULL. Другими словами, в результате DISTINCT, различные комбинации с NULL встретятся только один раз. Это отличается от обработки NULL в большинстве других контекстов.

Альтернативы

Можно получить такой же результат, применив GROUP BY для того же набора значений, которые указан в секции SELECT, без использования каких-либо агрегатных функций. Но есть несколько отличий от GROUP BY:

  • DISTINCT может применяться вместе с GROUP BY.
  • Когда секция ORDER BY опущена, а секция LIMIT присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
  • Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.