Funções de janela padrão
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,RANGEouGROUPS- define os limites de um frame; aggregate_function é calculada dentro desse frame.ROWSconta linhas físicas,RANGEconta valores deORDER BYeGROUPSconta grupos de pares (linhas iguais na chaveORDER BY).WINDOW- permite que várias expressões usem a mesma definição de janela.
Funções utilizáveis apenas como funções de janela
lagInFrame, leadInFrame e nonNegativeDerivative são extensões do ClickHouse.
Exemplos
Numeração de linhas
Funções de agregação
Particionamento por coluna
Delimitação do frame
Frame GROUPS
GROUPS conta grupos de pares completos — conjuntos de linhas iguais na chave ORDER BY — em vez de linhas físicas (ROWS) ou valores de ORDER BY (RANGE). N PRECEDING e N FOLLOWING contam N grupos de pares antes e depois do grupo de pares da linha atual, e cada grupo de pares incluído sempre contribui com todas as suas linhas.
A consulta abaixo aplica os mesmos limites de 1 PRECEDING AND 1 FOLLOWING a frames ROWS, RANGE e GROUPS. A coluna order contém valores duplicados e não consecutivos; portanto, os três modos abrangem linhas diferentes:
ROWSconta linhas físicas, portanto o frame contém no máximo três linhas adjacentes: a linha atual e uma de cada lado.RANGEconta valores deorder, portanto1 PRECEDINGe1 FOLLOWINGabrangem linhas cujoorderestá a uma distância de até 1 do valor da linha atual. Com lacunas de 10, nenhuma linha vizinha se qualifica, então o frame contém apenas as linhas que têm o mesmoorderda linha atual.GROUPSconta grupos de pares, portanto1 PRECEDINGe1 FOLLOWINGsempre incluem integralmente os grupos adjacentes, independentemente das lacunas entre os valores deorder.
Exemplos práticos
Salário máximo/total por departamento
Soma cumulativa
Média móvel/deslizante (a cada 3 linhas)
Média móvel/deslizante (a cada 10 segundos)
Média móvel / deslizante (a cada 10 dias)
Range e ORDER BY toDate(ts), formamos um frame de 10 unidades e, como usamos toDate(ts), a unidade é o dia.