Skip to main content
Las funciones de ventana permiten realizar cálculos sobre un conjunto de filas relacionadas con la fila actual. Pueden utilizarse para realizar cálculos 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 SQL estándar para ventanas y funciones de ventana. La tabla siguiente muestra qué funcionalidades se admiten actualmente:

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, RANGE o GROUPS - define los límites del marco; aggregate_function se calcula dentro de ese marco. ROWS cuenta filas físicas, RANGE cuenta valores de ORDER BY y GROUPS cuenta grupos de pares (filas iguales en la clave ORDER BY).
  • WINDOW - permite que varias expresiones usen la misma definición de ventana.

Funciones que solo pueden usarse como funciones de ventana

Las siguientes funciones solo pueden usarse como funciones de ventana. La mayoría son funciones SQL estándar; lagInFrame, leadInFrame y nonNegativeDerivative son extensiones de ClickHouse.

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

Marco GROUPS

Un marco GROUPS cuenta grupos de pares completos —conjuntos de filas iguales según la clave ORDER BY—, en lugar de filas físicas (ROWS) o valores de ORDER BY (RANGE). N PRECEDING y N FOLLOWING cuentan N grupos de pares antes y después del grupo de pares de la fila actual, y cada grupo de pares incluido siempre aporta todas sus filas. La siguiente consulta aplica los mismos límites 1 PRECEDING AND 1 FOLLOWING a marcos ROWS, RANGE y GROUPS. La columna order contiene valores duplicados y no consecutivos, por lo que los tres modos abarcan filas distintas:
Cada modo interpreta los límites de forma diferente:
  • ROWS cuenta filas físicas, por lo que el marco incluye como máximo tres filas adyacentes: la fila actual y una a cada lado.
  • RANGE cuenta valores de order, por lo que 1 PRECEDING y 1 FOLLOWING abarcan las filas cuyo order difiere en como máximo 1 del de la fila actual. Con huecos de 10, ninguna fila vecina cumple esta condición, por lo que el marco contiene solo las filas que comparten el order actual.
  • GROUPS cuenta grupos de pares, por lo que 1 PRECEDING y 1 FOLLOWING siempre incluyen por completo los grupos adyacentes, independientemente de los huecos entre los valores de order.

Ejemplos reales

Los siguientes ejemplos resuelven problemas habituales en el mundo real.

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)

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, como toDate(ts), la unidad es un día.

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 14 de agosto de 2026