Clickhouse: Cláusula LIMIT BY

Cláusula LIMIT BY

Uma consulta com a  cláusula LIMIT BY seleciona as primeiras n linhas para cada valor distinto de expressions. A chave para LIMIT BY pode conter qualquer número de expressões. 

O ClickHouse suporta as seguintes variantes de sintaxe:

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

Durante o processamento da consulta, o ClickHouse seleciona dados ordenados por chave de classificação. A chave de classificação é definida explicitamente usando uma cláusula ORDER BY ou implicitamente como uma propriedade do mecanismo de tabela (a ordem das linhas só é garantida ao usar ORDER BY , caso contrário, os blocos de linhas não serão ordenados devido ao multithreading). Então o ClickHouse aplica LIMIT BY e retorna as primeiras n linhas para cada combinação distinta de expressions. Se OFFSET for especificado, então para cada bloco de dados que pertence a uma combinação distinta de expressions, o ClickHouse pula offset_value o número de linhas do início do bloco e retorna um máximo de nlinhas como resultado. Se offset_value for maior que o número de linhas no bloco de dados, o ClickHouse retorna zero linhas do bloco.

Observação
LIMIT BY não está relacionado a LIMIT e ambos podem ser usados na mesma consulta.

Se você quiser usar números de coluna em vez de nomes de coluna na LIMIT BY cláusula, habilite a configuração enable_positional_arguments.

Tabela de Exemplo:

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

Consultas:

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

A consult SELECT * FROM limit_by ORDER BY id, val LIMIT 2 OFFSET 1 BY id 0

retorna o mesmo resultado.

A consulta a seguir retorna os 5 principais referenciadores para cada domain, device_typepar com um máximo de 100 linhas no total ( 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


Referências:

LIMIT BY Clause. Clickhouse.com. Disponível em:
https://clickhouse.com/docs/en/sql-reference/statements/select/limit-by. Acesso em: 05 Jan 2024.

Data de Publicação: 28-08-2024

Categoria: Clickhouse