mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Initial
This commit is contained in:
parent
5f84564207
commit
9ce7669e1f
@ -6,6 +6,96 @@ toc_title: DISTINCT
|
||||
|
||||
If `SELECT DISTINCT` is specified, only unique rows will remain in a query result. Thus only a single row will remain out of all the sets of fully matching rows in the result.
|
||||
|
||||
You can narrow the list of columns which must have unique values: `SELECT DISTINCT ON (column1, column2,...)`. If the columns are not specified, all of them are taken into consideration.
|
||||
|
||||
Consider the table:
|
||||
|
||||
```text
|
||||
┌─a─┬─b─┬─c─┐
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 1 │ 1 │ 2 │
|
||||
│ 1 │ 2 │ 2 │
|
||||
└───┴───┴───┘
|
||||
```
|
||||
|
||||
Using `DISTINCT` without specifying columns:
|
||||
|
||||
```sql
|
||||
SELECT DISTINCT * FROM t1;
|
||||
```
|
||||
|
||||
```text
|
||||
┌─a─┬─b─┬─c─┐
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 1 │ 1 │ 2 │
|
||||
│ 1 │ 2 │ 2 │
|
||||
└───┴───┴───┘
|
||||
```
|
||||
|
||||
Using `DISTINCT` with specified columns:
|
||||
|
||||
```sql
|
||||
SELECT DISTINCT ON (a,b) * FROM t1;
|
||||
```
|
||||
|
||||
```text
|
||||
┌─a─┬─b─┬─c─┐
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 1 │ 2 │ 2 │
|
||||
└───┴───┴───┘
|
||||
```
|
||||
|
||||
## DISTINCT and ORDER BY {#distinct-orderby}
|
||||
|
||||
ClickHouse supports using the `DISTINCT` and `ORDER BY` clauses for different columns in one query. The `DISTINCT` clause is executed before the `ORDER BY` clause.
|
||||
|
||||
Consider the table:
|
||||
|
||||
``` text
|
||||
┌─a─┬─b─┐
|
||||
│ 2 │ 1 │
|
||||
│ 1 │ 2 │
|
||||
│ 3 │ 3 │
|
||||
│ 2 │ 4 │
|
||||
└───┴───┘
|
||||
```
|
||||
|
||||
Selecting data:
|
||||
|
||||
```sql
|
||||
SELECT DISTINCT a FROM t1 ORDER BY b ASC;
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─a─┐
|
||||
│ 2 │
|
||||
│ 1 │
|
||||
│ 3 │
|
||||
└───┘
|
||||
```
|
||||
Selecting data with the different sorting direction:
|
||||
|
||||
```sql
|
||||
SELECT DISTINCT a FROM t1 ORDER BY b DESC;
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─a─┐
|
||||
│ 3 │
|
||||
│ 1 │
|
||||
│ 2 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
Row `2, 4` was cut before sorting.
|
||||
|
||||
Take this implementation specificity into account when programming queries.
|
||||
|
||||
## Null Processing {#null-processing}
|
||||
|
||||
`DISTINCT` works with [NULL](../../../sql-reference/syntax.md#null-literal) as if `NULL` were a specific value, and `NULL==NULL`. In other words, in the `DISTINCT` results, different combinations with `NULL` occur only once. It differs from `NULL` processing in most other contexts.
|
||||
@ -18,41 +108,3 @@ It is possible to obtain the same result by applying [GROUP BY](../../../sql-ref
|
||||
- When [ORDER BY](../../../sql-reference/statements/select/order-by.md) is omitted and [LIMIT](../../../sql-reference/statements/select/limit.md) is defined, the query stops running immediately after the required number of different rows has been read.
|
||||
- Data blocks are output as they are processed, without waiting for the entire query to finish running.
|
||||
|
||||
## Examples {#examples}
|
||||
|
||||
ClickHouse supports using the `DISTINCT` and `ORDER BY` clauses for different columns in one query. The `DISTINCT` clause is executed before the `ORDER BY` clause.
|
||||
|
||||
Example table:
|
||||
|
||||
``` text
|
||||
┌─a─┬─b─┐
|
||||
│ 2 │ 1 │
|
||||
│ 1 │ 2 │
|
||||
│ 3 │ 3 │
|
||||
│ 2 │ 4 │
|
||||
└───┴───┘
|
||||
```
|
||||
|
||||
When selecting data with the `SELECT DISTINCT a FROM t1 ORDER BY b ASC` query, we get the following result:
|
||||
|
||||
``` text
|
||||
┌─a─┐
|
||||
│ 2 │
|
||||
│ 1 │
|
||||
│ 3 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
If we change the sorting direction `SELECT DISTINCT a FROM t1 ORDER BY b DESC`, we get the following result:
|
||||
|
||||
``` text
|
||||
┌─a─┐
|
||||
│ 3 │
|
||||
│ 1 │
|
||||
│ 2 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
Row `2, 4` was cut before sorting.
|
||||
|
||||
Take this implementation specificity into account when programming queries.
|
||||
|
@ -13,7 +13,7 @@ toc_title: Overview
|
||||
|
||||
``` sql
|
||||
[WITH expr_list|(subquery)]
|
||||
SELECT [DISTINCT] expr_list
|
||||
SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
|
||||
[FROM [db.]table | (subquery) | table_function] [FINAL]
|
||||
[SAMPLE sample_coeff]
|
||||
[ARRAY JOIN ...]
|
||||
@ -36,6 +36,8 @@ All clauses are optional, except for the required list of expressions immediatel
|
||||
Specifics of each optional clause are covered in separate sections, which are listed in the same order as they are executed:
|
||||
|
||||
- [WITH clause](../../../sql-reference/statements/select/with.md)
|
||||
- [SELECT clause](#select-clause)
|
||||
- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md)
|
||||
- [FROM clause](../../../sql-reference/statements/select/from.md)
|
||||
- [SAMPLE clause](../../../sql-reference/statements/select/sample.md)
|
||||
- [JOIN clause](../../../sql-reference/statements/select/join.md)
|
||||
@ -44,8 +46,6 @@ Specifics of each optional clause are covered in separate sections, which are li
|
||||
- [GROUP BY clause](../../../sql-reference/statements/select/group-by.md)
|
||||
- [LIMIT BY clause](../../../sql-reference/statements/select/limit-by.md)
|
||||
- [HAVING clause](../../../sql-reference/statements/select/having.md)
|
||||
- [SELECT clause](#select-clause)
|
||||
- [DISTINCT clause](../../../sql-reference/statements/select/distinct.md)
|
||||
- [LIMIT clause](../../../sql-reference/statements/select/limit.md)
|
||||
- [OFFSET clause](../../../sql-reference/statements/select/offset.md)
|
||||
- [UNION clause](../../../sql-reference/statements/select/union.md)
|
||||
|
@ -6,19 +6,51 @@ toc_title: DISTINCT
|
||||
|
||||
Если указан `SELECT DISTINCT`, то в результате запроса останутся только уникальные строки. Таким образом, из всех наборов полностью совпадающих строк в результате останется только одна строка.
|
||||
|
||||
## Обработка NULL {#null-processing}
|
||||
Вы можете указать столбцы, по которым хотите отбирать уникальные значения: `SELECT DISTINCT ON (column1, column2,...)`. Если столбцы не указаны, то отбираются строки, в которых значения уникальны во всех столбцах.
|
||||
|
||||
`DISTINCT` работает с [NULL](../../syntax.md#null-literal) как-будто `NULL` — обычное значение и `NULL==NULL`. Другими словами, в результате `DISTINCT`, различные комбинации с `NULL` встретятся только один раз. Это отличается от обработки `NULL` в большинстве других контекстов.
|
||||
Рассмотрим таблицу:
|
||||
|
||||
## Альтернативы {#alternatives}
|
||||
```text
|
||||
┌─a─┬─b─┬─c─┐
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 1 │ 1 │ 1 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 2 │ 2 │ 2 │
|
||||
│ 1 │ 1 │ 2 │
|
||||
│ 1 │ 2 │ 2 │
|
||||
└───┴───┴───┘
|
||||
```
|
||||
|
||||
Такой же результат можно получить, применив секцию [GROUP BY](group-by.md) для того же набора значений, которые указан в секции `SELECT`, без использования каких-либо агрегатных функций. Но есть от `GROUP BY` несколько отличий:
|
||||
Использование `DISTINCT` без указания столбцов:
|
||||
|
||||
- `DISTINCT` может применяться вместе с `GROUP BY`.
|
||||
- Когда секция [ORDER BY](order-by.md) опущена, а секция [LIMIT](limit.md) присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
|
||||
- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.
|
||||
```sql
|
||||
SELECT DISTINCT * FROM t1;
|
||||
```
|
||||
|
||||
## Примеры {#examples}
|
||||
```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`.
|
||||
|
||||
@ -56,3 +88,16 @@ ClickHouse поддерживает использование секций `DIS
|
||||
Ряд `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) присутствует, запрос прекращает выполнение сразу после считывания необходимого количества различных строк.
|
||||
- Блоки данных выводятся по мере их обработки, не дожидаясь завершения выполнения всего запроса.
|
||||
|
||||
|
@ -11,7 +11,7 @@ toc_title: "Обзор"
|
||||
|
||||
``` sql
|
||||
[WITH expr_list|(subquery)]
|
||||
SELECT [DISTINCT] expr_list
|
||||
SELECT [DISTINCT [ON (column1, column2, ...)]] expr_list
|
||||
[FROM [db.]table | (subquery) | table_function] [FINAL]
|
||||
[SAMPLE sample_coeff]
|
||||
[ARRAY JOIN ...]
|
||||
@ -34,6 +34,8 @@ SELECT [DISTINCT] expr_list
|
||||
Особенности каждой необязательной секции рассматриваются в отдельных разделах, которые перечислены в том же порядке, в каком они выполняются:
|
||||
|
||||
- [Секция WITH](with.md)
|
||||
- [Секция SELECT](#select-clause)
|
||||
- [Секция DISTINCT](distinct.md)
|
||||
- [Секция FROM](from.md)
|
||||
- [Секция SAMPLE](sample.md)
|
||||
- [Секция JOIN](join.md)
|
||||
@ -42,8 +44,6 @@ SELECT [DISTINCT] expr_list
|
||||
- [Секция GROUP BY](group-by.md)
|
||||
- [Секция LIMIT BY](limit-by.md)
|
||||
- [Секция HAVING](having.md)
|
||||
- [Секция SELECT](#select-clause)
|
||||
- [Секция DISTINCT](distinct.md)
|
||||
- [Секция LIMIT](limit.md)
|
||||
[Секция OFFSET](offset.md)
|
||||
- [Секция UNION ALL](union.md)
|
||||
|
Loading…
Reference in New Issue
Block a user