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
子句中使用列号而不是列名,请启用设置 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