Funções de janela padrão
| Recurso | Suportado? |
|---|---|
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 | ✅ (o padrão) |
sintaxe INTERVAL para 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)) | ✅ (Há suporte para todas as funções agregadas) |
rank(), dense_rank(), row_number() | ✅ Alias: denseRank() |
percent_rank() | ✅ Calcula com eficiência a posição relativa de um valor dentro de uma partição em um conjunto de dados. Essa função substitui, na prática, 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) Alias: percentRank() |
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 soluções alternativas a seguir: 1) any(value) over (.... rows between <offset> preceding and <offset> preceding), ou following 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 assim: (partition by x order by y rows between unbounded preceding and unbounded following). |
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 dametric_column fornecida em relação à timestamp_column.
INTERVAL pode ser omitido; o padrão é INTERVAL 1 SECOND.
O valor calculado para cada linha é:
0para a 1ª linha,- para a 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
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
Numeração de linhas
Funções de agregação
Particionamento por coluna
Definição dos limites do frame
Exemplos práticos
Salário máximo/total por departamento
Soma cumulativa
Média móvel / deslizante (em 3 linhas)
Média móvel/deslizante (a cada 10 segundos)
Média móvel / deslizante (de 10 dias)
Range e ORDER BY toDate(ts), formamos um frame de 10 unidades e, por causa de toDate(ts), a unidade é um dia.