Funciones de ventana estándar
| Característica | ¿Compatible? |
|---|---|
especificación ad hoc de ventana (count(*) over (partition by id order by time desc)) | ✅ |
expresiones que incluyen funciones de ventana, p. ej. (count(*) over ()) / 2) | ✅ |
cláusula WINDOW (select ... from table window w as (partition by id)) | ✅ |
marco ROWS | ✅ |
marco RANGE | ✅ (el valor predeterminado) |
sintaxis INTERVAL para el marco DateTime RANGE OFFSET | ❌ (especifique en su lugar el número de segundos (RANGE funciona con cualquier tipo numérico).) |
marco GROUPS | ❌ |
Cálculo de funciones de agregación sobre un marco (sum(value) over (order by time)) | ✅ (Se admiten todas las funciones de agregación) |
rank(), dense_rank(), row_number() | ✅ Alias: denseRank() |
percent_rank() | ✅ Calcula eficientemente la posición relativa de un valor dentro de una partición en un conjunto de datos. Esta función sustituye eficazmente el cálculo manual en SQL, más verboso y computacionalmente más costoso, expresado 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 la distribución acumulada de un valor dentro de un grupo de valores. Devuelve el porcentaje de filas con valores menores o iguales que el valor de la fila actual. |
lag/lead(value, offset) | ✅ También puede usar una de las siguientes alternativas: 1) any(value) over (.... rows between <offset> preceding and <offset> preceding), o following para lead 2) lagInFrame/leadInFrame, que son análogas, pero respetan el marco de la ventana. Para obtener un comportamiento idéntico a lag/lead, use rows between unbounded preceding and unbounded following |
| ntile(buckets) | ✅ Especifique la ventana así: (partition by x order by y rows between unbounded preceding and unbounded following). |
ClickHouse-specific window functions
También existe la siguiente función de ventana específica de ClickHouse:nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS])
Calcula la derivada no negativa de lametric_column indicada con respecto a timestamp_column.
INTERVAL puede omitirse; el valor predeterminado es INTERVAL 1 SECOND.
El valor calculado para cada fila es el siguiente:
0para la primera fila,- para la fila .
Sintaxis
PARTITION BY- define cómo dividir un conjunto de resultados en grupos.ORDER BY- define cómo ordenar las filas dentro del grupo durante el cálculo de aggregate_function.ROWS or RANGE- define los límites del marco; aggregate_function se calcula dentro de ese marco.WINDOW- permite que varias expresiones usen la misma definición de ventana.
Funciones
row_number()- Numera la fila actual dentro de su partición a partir de 1.first_value(x)- Devuelve el primer valor evaluado dentro de su marco ordenado.last_value(x)- Devuelve el último valor evaluado dentro de su marco ordenado.nth_value(x, offset)- Devuelve el primer valor no NULL evaluado en la enésima fila (offset) de su marco ordenado.rank()- Asigna un rango a la fila actual dentro de su partición con huecos.dense_rank()- Asigna un rango a la fila actual dentro de su partición sin huecos.lagInFrame(x)- Devuelve un valor evaluado en la fila situada un desplazamiento físico especificado antes de la fila actual dentro del marco ordenado.leadInFrame(x)- Devuelve un valor evaluado en la fila situada un número de filas de desplazamiento después de la fila actual dentro del marco ordenado.
Ejemplos
Numerar filas
Funciones de agregación
Particionamiento por columna
Límites del marco
Ejemplos reales
Salario máximo/total por departamento
Suma acumulada
Media móvil / deslizante (de 3 filas)
Media móvil / deslizante (cada 10 segundos)
Media móvil / deslizante (por 10 días)
Range y ORDER BY toDate(ts) formamos un marco de 10 unidades y, dado que toDate(ts) se utiliza, la unidad es un día.