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. 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.

If you want to use column numbers instead of column names in the LIMIT BY clause, enable the setting enable_positional_arguments.


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);


SELECT * FROM limit_by ORDER BY id, val LIMIT 2 BY id
│  1 │  10 │
│  1 │  11 │
│  2 │  20 │
│  2 │  21 │
SELECT * FROM limit_by ORDER BY id, val LIMIT 1, 2 BY id
│  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).

    domainWithoutWWW(URL) AS domain,
    domainWithoutWWW(REFERRER_URL) AS referrer,
    count() cnt
FROM hits
GROUP BY domain, referrer, device_type
LIMIT 5 BY domain, device_type

Rating: 3.4 - 21 votes

Was this content helpful?