Funciones de ventana estándar
| Característica | ¿Compatible? | Comentario |
|---|---|---|
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 | ✅ | Se usa de forma predeterminada cuando no se especifica explícitamente un marco (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW). |
Sintaxis INTERVAL para el marco DateTime RANGE OFFSET | ❌ | En su lugar, especifique 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()/denseRank(), row_number() | ✅ | |
percent_rank()/percentRank() | ✅ | Calcula de forma eficiente la posición relativa de un valor dentro de una partición. Sustituye el cálculo manual en SQL, más detallado 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). |
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 en lugar de PRECEDING para lead 2) lagInFrame/leadInFrame, que son análogas pero respetan el marco de ventana. Para obtener un comportamiento idéntico a lag/lead, use ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING. |
ntile(buckets) | ✅ | Especifique la ventana como, por ejemplo, (PARTITION BY x ORDER BY y ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING). |
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 que solo pueden usarse como funciones de ventana
lagInFrame, leadInFrame y nonNegativeDerivative son extensiones de ClickHouse.
| Función | Descripción |
|---|---|
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 distinto de NULL evaluado en la n.ª 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 el valor evaluado en la fila que se encuentra un número especificado de filas físicas antes de la fila actual dentro del marco ordenado. |
leadInFrame(x) | Devuelve el valor evaluado en la fila que se encuentra un número especificado de filas después de la fila actual dentro del marco ordenado. |
nonNegativeDerivative(metric_column, timestamp_column[, INTERVAL X UNITS]) | Calcula la derivada no negativa de metric_column con respecto a timestamp_column. Es específica de ClickHouse. |
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 (cada 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, como toDate(ts), la unidad es un día.