Saltar al contenido principal
Las funciones de ventana permiten realizar cálculos sobre un conjunto de filas relacionadas con la fila actual. Algunos de los cálculos que puede realizar son similares a los que pueden hacerse con una función de agregación, pero una función de ventana no agrupa las filas en una única salida: se siguen devolviendo las filas individuales.

Funciones de ventana estándar

ClickHouse admite la gramática estándar para definir ventanas y funciones de ventana. La siguiente tabla indica si una funcionalidad es compatible actualmente.

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 la metric_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:
  • 0 para la primera fila,
  • metricimetrici1timestampitimestampi1interval{\text{metric}_i - \text{metric}_{i-1} \over \text{timestamp}_i - \text{timestamp}_{i-1}} * \text{interval} para la fila ithi_{th}.

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

Estas funciones solo se pueden usar como función de ventana.
  • 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

Veamos algunos ejemplos de cómo se pueden utilizar las funciones de ventana.

Numerar filas

Funciones de agregación

Compara el salario de cada jugador con el promedio de su equipo.
Compare el salario de cada jugador con el salario máximo de su equipo.

Particionamiento por columna

Límites del marco

┌─part_key─┬─value─┬─order─┬─frame_values─┬─rn_1─┬─rn_2─┬─rn_3─┬─rn_4─┐ │ 1 │ 1 │ 1 │ [5,4,3,2,1] │ 5 │ 5 │ 5 │ 2 │ │ 1 │ 2 │ 2 │ [5,4,3,2] │ 4 │ 4 │ 4 │ 2 │ │ 1 │ 3 │ 3 │ [5,4,3] │ 3 │ 3 │ 3 │ 2 │ │ 1 │ 4 │ 4 │ [5,4] │ 2 │ 2 │ 2 │ 2 │ │ 1 │ 5 │ 5 │ [5] │ 1 │ 1 │ 1 │ 1 │ └──────────┴───────┴───────┴──────────────┴──────┴──────┴──────┴──────┘
┌─frame_values_1─┬─second_value─┐ │ [1] │ ᴺᵁᴸᴸ │ │ [1,2] │ 2 │ │ [1,2,3] │ 2 │ │ [1,2,3,4] │ 2 │ │ [2,3,4,5] │ 3 │ └────────────────┴──────────────┘

Ejemplos reales

Los siguientes ejemplos resuelven problemas habituales en el mundo real.

Salario máximo/total por departamento

Suma acumulada

Media móvil / deslizante (de 3 filas)

insert into sensors values(‘cpu_temp’, ‘2020-01-01 00:00:00’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:01’, 77), (‘cpu_temp’, ‘2020-01-01 00:00:02’, 93), (‘cpu_temp’, ‘2020-01-01 00:00:03’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:04’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:05’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:06’, 87), (‘cpu_temp’, ‘2020-01-01 00:00:07’, 87);

Media móvil / deslizante (cada 10 segundos)

Media móvil / deslizante (por 10 días)

La temperatura se almacena con precisión de segundos, pero al usar 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.
insert into sensors values(‘ambient_temp’, ‘2020-01-01 00:00:00’, 16), (‘ambient_temp’, ‘2020-01-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-01-02 11:00:00’, 9), (‘ambient_temp’, ‘2020-01-02 12:00:00’, 9), (‘ambient_temp’, ‘2020-02-01 10:00:00’, 10), (‘ambient_temp’, ‘2020-02-01 12:00:00’, 10), (‘ambient_temp’, ‘2020-02-10 12:00:00’, 12), (‘ambient_temp’, ‘2020-02-10 13:00:00’, 12), (‘ambient_temp’, ‘2020-02-20 12:00:01’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16), (‘ambient_temp’, ‘2020-03-01 12:00:00’, 16);

Referencias

Issues de GitHub

La hoja de ruta para la compatibilidad inicial con las funciones de ventana está en este issue. Todos los issues de GitHub relacionados con las funciones de ventana tienen la etiqueta comp-window-functions.

Pruebas

Estas pruebas contienen ejemplos de la sintaxis admitida actualmente: https://github.com/ClickHouse/ClickHouse/blob/master/tests/performance/window_functions.xml https://github.com/ClickHouse/ClickHouse/blob/master/tests/queries/0_stateless/01591_window_functions.sql

Documentación de Postgres

https://www.postgresql.org/docs/current/sql-select.html#SQL-WINDOW https://www.postgresql.org/docs/devel/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS https://www.postgresql.org/docs/devel/functions-window.html https://www.postgresql.org/docs/devel/tutorial-window.html

Documentación de MySQL

https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html
Última modificación el 19 de junio de 2026