mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-12-02 04:22:03 +00:00
104 lines
4.1 KiB
Markdown
104 lines
4.1 KiB
Markdown
---
|
||
toc_title: DISTINCT
|
||
---
|
||
|
||
# Секция DISTINCT {#select-distinct}
|
||
|
||
Если указан `SELECT DISTINCT`, то в результате запроса останутся только уникальные строки. Таким образом, из всех наборов полностью совпадающих строк в результате останется только одна строка.
|
||
|
||
Вы можете указать столбцы, по которым хотите отбирать уникальные значения: `SELECT DISTINCT ON (column1, column2,...)`. Если столбцы не указаны, то отбираются строки, в которых значения уникальны во всех столбцах.
|
||
|
||
Рассмотрим таблицу:
|
||
|
||
```text
|
||
┌─a─┬─b─┬─c─┐
|
||
│ 1 │ 1 │ 1 │
|
||
│ 1 │ 1 │ 1 │
|
||
│ 2 │ 2 │ 2 │
|
||
│ 2 │ 2 │ 2 │
|
||
│ 1 │ 1 │ 2 │
|
||
│ 1 │ 2 │ 2 │
|
||
└───┴───┴───┘
|
||
```
|
||
|
||
Использование `DISTINCT` без указания столбцов:
|
||
|
||
```sql
|
||
SELECT DISTINCT * FROM t1;
|
||
```
|
||
|
||
```text
|
||
┌─a─┬─b─┬─c─┐
|
||
│ 1 │ 1 │ 1 │
|
||
│ 2 │ 2 │ 2 │
|
||
│ 1 │ 1 │ 2 │
|
||
│ 1 │ 2 │ 2 │
|
||
└───┴───┴───┘
|
||
```
|
||
|
||
Использование `DISTINCT` с указанием столбцов:
|
||
|
||
```sql
|
||
SELECT DISTINCT ON (a,b) * FROM t1;
|
||
```
|
||
|
||
```text
|
||
┌─a─┬─b─┬─c─┐
|
||
│ 1 │ 1 │ 1 │
|
||
│ 2 │ 2 │ 2 │
|
||
│ 1 │ 2 │ 2 │
|
||
└───┴───┴───┘
|
||
```
|
||
|
||
## DISTINCT и ORDER BY {#distinct-orderby}
|
||
|
||
ClickHouse поддерживает использование секций `DISTINCT` и `ORDER BY` для разных столбцов в одном запросе. Секция `DISTINCT` выполняется до секции `ORDER BY`.
|
||
|
||
Таблица для примера:
|
||
|
||
``` text
|
||
┌─a─┬─b─┐
|
||
│ 2 │ 1 │
|
||
│ 1 │ 2 │
|
||
│ 3 │ 3 │
|
||
│ 2 │ 4 │
|
||
└───┴───┘
|
||
```
|
||
|
||
При выборе данных с помощью `SELECT DISTINCT a FROM t1 ORDER BY b ASC`, мы получаем следующий результат:
|
||
|
||
``` text
|
||
┌─a─┐
|
||
│ 2 │
|
||
│ 1 │
|
||
│ 3 │
|
||
└───┘
|
||
```
|
||
|
||
Если мы изменим направление сортировки `SELECT DISTINCT a FROM t1 ORDER BY b DESC`, мы получаем следующий результат:
|
||
|
||
``` text
|
||
┌─a─┐
|
||
│ 3 │
|
||
│ 1 │
|
||
│ 2 │
|
||
└───┘
|
||
```
|
||
|
||
Ряд `2, 4` был разрезан перед сортировкой.
|
||
|
||
Учитывайте эту специфику при разработке запросов.
|
||
|
||
## Обработка NULL {#null-processing}
|
||
|
||
`DISTINCT` работает с [NULL](../../syntax.md#null-literal) как-будто `NULL` — обычное значение и `NULL==NULL`. Другими словами, в результате `DISTINCT`, различные комбинации с `NULL` встретятся только один раз. Это отличается от обработки `NULL` в большинстве других контекстов.
|
||
|
||
## Альтернативы {#alternatives}
|
||
|
||
Можно получить такой же результат, применив [GROUP BY](group-by.md) для того же набора значений, которые указан в секции `SELECT`, без использования каких-либо агрегатных функций. Но есть несколько отличий от `GROUP BY`:
|
||
|
||
- `DISTINCT` может применяться вместе с `GROUP BY`.
|
||
- Когда секция [ORDER BY](order-by.md) опущена, а секция [LIMIT](limit.md) присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
|
||
- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.
|
||
|