Funções de janela padrão
| Recurso | Suportado? | Comentário |
|---|---|---|
Especificação de janela ad hoc (count(*) OVER (PARTITION BY id ORDER BY time DESC)) | ✅ | |
Expressões que envolvem funções de janela, por exemplo, (count(*) OVER ()) / 2 | ✅ | |
Cláusula WINDOW (SELECT ... FROM table WINDOW w AS (PARTITION BY id)) | ✅ | |
frame ROWS | ✅ | |
frame RANGE | ✅ | Usado por padrão quando um frame não é especificado explicitamente (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW). |
Sintaxe INTERVAL para o frame DateTime RANGE OFFSET | ❌ | Em vez disso, especifique o número de segundos (RANGE funciona com qualquer tipo numérico). |
frame GROUPS | ❌ | |
Cálculo de funções agregadas sobre um frame (sum(value) OVER (ORDER BY time)) | ✅ | Todas as funções agregadas são compatíveis. |
rank(), dense_rank()/denseRank(), row_number() | ✅ | |
percent_rank()/percentRank() | ✅ | Calcula com eficiência a posição relativa de um valor dentro de uma partição. Substitui o cálculo manual em SQL, mais verboso e computacionalmente mais custoso, expresso como ifNull((rank() OVER (PARTITION BY x ORDER BY y) - 1) / nullif(count(1) OVER (PARTITION BY x) - 1, 0), 0). |
cume_dist() | ✅ | Calcula a distribuição cumulativa de um valor dentro de um grupo de valores. Retorna a porcentagem de linhas com valores menores ou iguais ao valor da linha atual. |
lag/lead(value, offset) | ✅ | Você também pode usar uma das seguintes alternativas: 1) any(value) OVER (... ROWS BETWEEN <offset> PRECEDING AND <offset> PRECEDING), ou FOLLOWING em vez de PRECEDING para lead 2) lagInFrame/leadInFrame, que são análogas, mas respeitam o frame da janela. Para obter um comportamento idêntico a lag/lead, use ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. |
ntile(buckets) | ✅ | Especifique a janela como, por exemplo, (PARTITION BY x ORDER BY y ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING). |
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 utilizáveis apenas como funções de janela
lagInFrame, leadInFrame e nonNegativeDerivative são extensões do ClickHouse.
| Function | Description |
|---|---|
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 n-ésima linha (deslocamento) 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á a 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 de deslocamento após a linha atual dentro do frame ordenado. |
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS]) | Calcula a derivada não negativa de metric_column em relação a timestamp_column. Específico do ClickHouse. |
Exemplos
Numeração de linhas
Funções de agregação
Particionamento por coluna
Delimitação do frame
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.