ClickHouse/docs/zh/sql-reference/statements/select/limit-by.md
2023-03-03 10:35:07 +00:00

2.4 KiB
Raw Blame History

slug sidebar_label
/zh/sql-reference/statements/select/limit-by LIMIT BY

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那么对于每一分组ClickHouse会跳过前offset_value行,接着返回前n行。如果offset_value大于某一分组的行数ClickHouse会从分组返回0行。

:::note LIMIT BYLIMIT没有关系。它们可以在同一个查询中使用。 :::

样例表:

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个refferrer总计返回至多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