2.7 KiB
sidebar_label |
---|
LIMIT BY |
LIMIT BY Clause
A query with the LIMIT n BY expressions
clause selects the first n
rows for each distinct value of expressions
. The key for LIMIT BY
can contain any number of expressions.
ClickHouse supports the following syntax variants:
LIMIT [offset_value, ]n BY expressions
LIMIT n OFFSET offset_value BY expressions
During query processing, ClickHouse selects data ordered by sorting key. The sorting key is set explicitly using an ORDER BY clause or implicitly as a property of the table engine (row order is only guaranteed when using ORDER BY, otherwise the row blocks will not be ordered due to multi-threading). Then ClickHouse applies LIMIT n BY expressions
and returns the first n
rows for each distinct combination of expressions
. If OFFSET
is specified, then for each data block that belongs to a distinct combination of expressions
, ClickHouse skips offset_value
number of rows from the beginning of the block and returns a maximum of n
rows as a result. If offset_value
is bigger than the number of rows in the data block, ClickHouse returns zero rows from the block.
:::note
LIMIT BY
is not related to LIMIT. They can both be used in the same query.
:::
If you want to use column numbers instead of column names in the LIMIT BY
clause, enable the setting enable_positional_arguments.
Examples
Sample table:
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);
Queries:
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 │
└────┴─────┘
The SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id
query returns the same result.
The following query returns the top 5 referrers for each domain, device_type
pair with a maximum of 100 rows in total (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