mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-14 03:25:15 +00:00
cd14f9ebcb
* split up select.md * array-join.md basic refactoring * distinct.md basic refactoring * format.md basic refactoring * from.md basic refactoring * group-by.md basic refactoring * having.md basic refactoring * additional index.md refactoring * into-outfile.md basic refactoring * join.md basic refactoring * limit.md basic refactoring * limit-by.md basic refactoring * order-by.md basic refactoring * prewhere.md basic refactoring * adjust operators/index.md links * adjust sample.md links * adjust more links * adjust operatots links * fix some links * adjust aggregate function article titles * basic refactor of remaining select clauses * absolute paths in make_links.sh * run make_links.sh * remove old select.md locations * translate docs/es * translate docs/fr * translate docs/fa * remove old operators.md location * change operators.md links * adjust links in docs/es * adjust links in docs/es * minor texts adjustments * wip * update machine translations to use new links * fix changelog * es build fixes * get rid of some select.md links * temporary adjust ru links * temporary adjust more ru links * improve curly brace handling * adjust ru as well * fa build fix * ru link fixes * zh link fixes * temporary disable part of anchor checks
70 lines
3.3 KiB
Markdown
70 lines
3.3 KiB
Markdown
# Секция LIMIT BY {#limit-by-clause}
|
||
|
||
Запрос с секцией `LIMIT n BY expressions` выбирает первые `n` строк для каждого отличного значения `expressions`. Ключ `LIMIT BY` может содержать любое количество [выражений](../../syntax.md#syntax-expressions).
|
||
|
||
ClickHouse поддерживает следующий синтаксис:
|
||
|
||
- `LIMIT [offset_value, ]n BY expressions`
|
||
- `LIMIT n OFFSET offset_value BY expressions`
|
||
|
||
Во время обработки запроса, ClickHouse выбирает данные, упорядоченные по ключу сортировки. Ключ сортировки задаётся явно в секции [ORDER BY](order-by.md#select-order-by) или неявно в свойствах движка таблицы. Затем ClickHouse применяет `LIMIT n BY expressions` и возвращает первые `n` для каждой отличной комбинации `expressions`. Если указан `OFFSET`, то для каждого блока данных, который принадлежит отдельной комбинации `expressions`, ClickHouse отступает `offset_value` строк от начала блока и возвращает не более `n`. Если `offset_value` больше, чем количество строк в блоке данных, ClickHouse не возвращает ни одной строки.
|
||
|
||
`LIMIT BY` не связана с секцией `LIMIT`. Их можно использовать в одном запросе.
|
||
|
||
## Примеры
|
||
|
||
Образец таблицы:
|
||
|
||
``` sql
|
||
CREATE TABLE limit_by(id Int, val Int) ENGINE = Memory;
|
||
INSERT INTO limit_by values(1, 10), (1, 11), (1, 12), (2, 20), (2, 21);
|
||
```
|
||
|
||
Запросы:
|
||
|
||
``` sql
|
||
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 BY id
|
||
```
|
||
|
||
``` text
|
||
┌─id─┬─val─┐
|
||
│ 1 │ 10 │
|
||
│ 1 │ 11 │
|
||
│ 2 │ 20 │
|
||
│ 2 │ 21 │
|
||
└────┴─────┘
|
||
```
|
||
|
||
``` sql
|
||
SELECT * FROM limit_by ORDER BY id, val LIMIT 1, 2 BY id
|
||
```
|
||
|
||
``` text
|
||
┌─id─┬─val─┐
|
||
│ 1 │ 11 │
|
||
│ 1 │ 12 │
|
||
│ 2 │ 21 │
|
||
└────┴─────┘
|
||
```
|
||
|
||
Запрос `SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id` возвращает такой же результат.
|
||
|
||
Следующий запрос выбирает топ 5 рефереров для каждой пары `domain, device_type`, но не более 100 строк (`LIMIT n BY + LIMIT`).
|
||
|
||
``` sql
|
||
SELECT
|
||
domainWithoutWWW(URL) AS domain,
|
||
domainWithoutWWW(REFERRER_URL) AS referrer,
|
||
device_type,
|
||
count() cnt
|
||
FROM hits
|
||
GROUP BY domain, referrer, device_type
|
||
ORDER BY cnt DESC
|
||
LIMIT 5 BY domain, device_type
|
||
LIMIT 100
|
||
```
|
||
|
||
Запрос выберет топ 5 рефереров для каждой пары `domain, device_type`, но не более 100 строк (`LIMIT n BY + LIMIT`).
|
||
|
||
`LIMIT n BY` работает с [NULL](../../syntax.md#null-literal) как если бы это было конкретное значение. Т.е. в результате запроса пользователь получит все комбинации полей, указанных в `BY`.
|