Pular para o conteúdo principal
As funções de janela permitem realizar cálculos em um conjunto de linhas relacionadas à linha atual. Alguns dos cálculos que você pode fazer são semelhantes aos que podem ser feitos com uma função de agregação, mas uma função de janela não faz com que as linhas sejam agrupadas em uma única saída — as linhas individuais ainda são retornadas.

Funções de janela padrão

O ClickHouse oferece suporte à sintaxe padrão para definir janelas e funções de janela. A tabela abaixo indica se um recurso tem suporte no momento.

Funções de janela específicas do ClickHouse

Existe também a seguinte função de janela específica do ClickHouse:

nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])

Calcula a derivada não negativa da metric_column fornecida em relação à timestamp_column. INTERVAL pode ser omitido; o padrão é INTERVAL 1 SECOND. O valor calculado para cada linha é:
  • 0 para a 1ª linha,
  • metricimetrici1timestampitimestampi1interval{\text{metric}_i - \text{metric}_{i-1} \over \text{timestamp}_i - \text{timestamp}_{i-1}} * \text{interval} para a ithi_{th} linha.

Sintaxe

  • PARTITION BY - define como dividir um conjunto de resultados em grupos.
  • ORDER BY - define como ordenar as linhas dentro do grupo durante o cálculo de aggregate_function.
  • ROWS or RANGE - define os limites de um frame; aggregate_function é calculada dentro desse frame.
  • WINDOW - permite que várias expressões usem a mesma definição de janela.

Funções

Estas funções só podem ser usadas como funções de janela.
  • row_number() - Numera a linha atual dentro da partição, começando em 1.
  • first_value(x) - Retorna o primeiro valor avaliado dentro do frame ordenado.
  • last_value(x) - Retorna o último valor avaliado dentro do frame ordenado.
  • nth_value(x, offset) - Retorna o primeiro valor não NULL avaliado na enésima linha (offset) dentro do frame ordenado.
  • rank() - Classifica a linha atual dentro da partição, com lacunas.
  • dense_rank() - Classifica a linha atual dentro da partição, sem lacunas.
  • lagInFrame(x) - Retorna um valor avaliado na linha que está em um deslocamento físico especificado antes da linha atual dentro do frame ordenado.
  • leadInFrame(x) - Retorna um valor avaliado na linha que está a um número de linhas após a linha atual dentro do frame ordenado.

Exemplos

Veja alguns exemplos de como as funções de janela podem ser usadas.

Numeração de linhas

Funções de agregação

Compare o salário de cada jogador com a média do seu time.
Compare o salário de cada jogador com o salário máximo de sua equipe.

Particionamento por coluna

Definição dos limites do frame

┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐ │ 1 │ 1 │ 1 │ [5,4,3,2,1] │ 5 │ 5 │ 5 │ 2 │ │ 1 │ 2 │ 2 │ [5,4,3,2] │ 4 │ 4 │ 4 │ 2 │ │ 1 │ 3 │ 3 │ [5,4,3] │ 3 │ 3 │ 3 │ 2 │ │ 1 │ 4 │ 4 │ [5,4] │ 2 │ 2 │ 2 │ 2 │ │ 1 │ 5 │ 5 │ [5] │ 1 │ 1 │ 1 │ 1 │ └──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘
┌─frame_values_1─┬─second_value─┐ │ [1] │ ᴺᵁᴸᴸ │ │ [1,2] │ 2 │ │ [1,2,3] │ 2 │ │ [1,2,3,4] │ 2 │ │ [2,3,4,5] │ 3 │ └────────────────┴──────────────┘

Exemplos práticos

Os exemplos a seguir mostram como resolver problemas comuns em cenários reais.

Salário máximo/total por departamento

Soma cumulativa

Média móvel / deslizante (em 3 linhas)

insert into sensors values(‘cpu_temp’, ‘2020-01-01 00:00:00’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:01’, 77), (‘cpu_temp’, ‘2020-01-01 00:00:02’, 93), (‘cpu_temp’, ‘2020-01-01 00:00:03’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:04’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:05’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:06’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:07’, 87);

Média móvel/deslizante (a cada 10 segundos)

Média móvel / deslizante (de 10 dias)

A temperatura é armazenada com precisão de segundos, mas, ao usar Range e ORDER BY toDate(ts), formamos um frame de 10 unidades e, por causa de toDate(ts), a unidade é um dia.
insert into sensors values(‘ambient_temp’, ‘2020-01-01 00:00:00’, 16), (‘ambient_temp’, ‘2020-01-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-01-02 11:00:00’, 9), (‘ambient_temp’, ‘2020-01-02 12:00:00’, 9), (‘ambient_temp’, ‘2020-02-01 10:00:00’, 10), (‘ambient_temp’, ‘2020-02-01 12:00:00’, 10), (‘ambient_temp’, ‘2020-02-10 12:00:00’, 12), (‘ambient_temp’, ‘2020-02-10 13:00:00’, 12), (‘ambient_temp’, ‘2020-02-20 12:00:01’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16);

Referências

Issues no GitHub

O plano para o suporte inicial a funções de janela está nesta issue. Todas as issues do GitHub relacionadas a funções de janela têm a label comp-window-functions.

Testes

Estes testes contêm exemplos da gramática atualmente suportada: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

Documentação do Postgres

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

Documentação do MySQL

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
Última modificação em 12 de junho de 2026