* 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
3.3 KiB
Секция LIMIT BY
Запрос с секцией LIMIT n BY expressions
выбирает первые n
строк для каждого отличного значения expressions
. Ключ LIMIT BY
может содержать любое количество выражений.
ClickHouse поддерживает следующий синтаксис:
LIMIT [offset_value, ]n BY expressions
LIMIT n OFFSET offset_value BY expressions
Во время обработки запроса, ClickHouse выбирает данные, упорядоченные по ключу сортировки. Ключ сортировки задаётся явно в секции ORDER BY или неявно в свойствах движка таблицы. Затем ClickHouse применяет LIMIT n BY expressions
и возвращает первые n
для каждой отличной комбинации expressions
. Если указан OFFSET
, то для каждого блока данных, который принадлежит отдельной комбинации expressions
, ClickHouse отступает offset_value
строк от начала блока и возвращает не более n
. Если offset_value
больше, чем количество строк в блоке данных, ClickHouse не возвращает ни одной строки.
LIMIT BY
не связана с секцией LIMIT
. Их можно использовать в одном запросе.
Примеры
Образец таблицы:
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);
Запросы:
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 BY id
┌─id─┬─val─┐
│ 1 │ 10 │
│ 1 │ 11 │
│ 2 │ 20 │
│ 2 │ 21 │
└────┴─────┘
SELECT * FROM limit_by ORDER BY id, val LIMIT 1, 2 BY id
┌─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
).
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 как если бы это было конкретное значение. Т.е. в результате запроса пользователь получит все комбинации полей, указанных в BY
.