跳至主要内容

LIMIT BY 子句

带有 `LIMIT n BY expressions` 子句的查询将为 `expressions` 的每个不同值选择前 `n` 行。`LIMIT BY` 的键可以包含任意数量的表达式

ClickHouse 支持以下语法变体

  • LIMIT [offset_value, ]n BY expressions
  • LIMIT n OFFSET offset_value BY expressions

在查询处理期间,ClickHouse 通过排序键对数据进行排序。排序键是使用 ORDER BY 子句显式设置的,或者作为表引擎的属性隐式设置的(仅当使用 ORDER BY 时保证行顺序,否则由于多线程,行块将不会排序)。然后 ClickHouse 应用 `LIMIT n BY expressions` 并返回每个 `expressions` 的不同组合的前 `n` 行。如果指定了 `OFFSET`,则对于属于 `expressions` 的不同组合的每个数据块,ClickHouse 将跳过块开头 `offset_value` 行,并最多返回 `n` 行作为结果。如果 `offset_value` 大于数据块中的行数,则 ClickHouse 将从该块返回零行。

注意

`LIMIT BY` 与 LIMIT 无关。它们都可以在同一个查询中使用。

如果希望在 `LIMIT BY` 子句中使用列号而不是列名,请启用设置 enable_positional_arguments

示例

示例表

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` 查询返回相同的结果。

以下查询返回每个 `domain, device_type` 对的前 5 个来源,总共最多 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