LIMIT n BY expressions 子句的查询,会针对 expressions 的每个不同值选取前 n 行。LIMIT BY 的键可以包含任意数量的表达式。
ClickHouse 支持以下语法变体:
LIMIT [offset_value, ]n BY expressionsLIMIT n OFFSET offset_value BY expressions
LIMIT n BY expressions,并针对 expressions 的每种不同组合返回前 n 行。如果指定了 OFFSET,那么对于属于 expressions 某种不同组合的每个数据块,ClickHouse 会从块开头跳过 offset_value 行,并最多返回 n 行。如果 offset_value 大于数据块中的行数,ClickHouse 将不会从该块返回任何行。
LIMIT BY 与 LIMIT 无关。两者可以在同一个查询中同时使用。LIMIT BY 子句中使用列编号而不是列名,请启用设置 enable_positional_arguments。
示例
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id 查询会返回相同的结果。
以下查询会返回每个 domain, device_type 组合中排名前 5 的 referrer,总计最多返回 100 行 (LIMIT n BY + LIMIT) 。
LIMIT BY 也支持负的 limit 和 offset。与负 LIMIT 子句类似,你可以在 LIMIT BY 中使用负值,从每个分组的末尾选取行。
id 的最后 2 行。对于 id = 1,返回的是第 11 行和第 12 行;对于 id = 2,由于该组只有 2 行,因此两行都会返回。
id 的倒数第二行:末尾的 OFFSET -1 会丢弃每组的最后一行,而前面的 -1 则保留剩余结果中的最后一行。
也可以混合使用不同符号的 LIMIT 和 OFFSET。例如,要丢弃每组的第一行,再保留剩余结果中的最后 2 行:
id = 1,第一行 (10) 会被跳过;11, 12 中最后两行都会返回。对于 id = 2,第一行 (20) 会被跳过,因此只剩下 21。
LIMIT BY ALL
LIMIT BY ALL 等同于列出所有已 SELECT 且非聚合函数的表达式。
例如:
LIMIT BY 键会包含我们能够从中提取出的最多非聚合字段。
例如:
示例
SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id 查询返回的结果相同。
使用 LIMIT BY ALL: