Funciones de ventana estándar
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,RANGEoGROUPS- define los límites del marco; aggregate_function se calcula dentro de ese marco.ROWScuenta filas físicas,RANGEcuenta valores deORDER BYyGROUPScuenta grupos de pares (filas iguales en la claveORDER BY).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.
Ejemplos
Numerar filas
Funciones de agregación
Particionamiento por columna
Límites del marco
Marco GROUPS
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:
ROWScuenta filas físicas, por lo que el marco incluye como máximo tres filas adyacentes: la fila actual y una a cada lado.RANGEcuenta valores deorder, por lo que1 PRECEDINGy1 FOLLOWINGabarcan las filas cuyoorderdifiere 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 elorderactual.GROUPScuenta grupos de pares, por lo que1 PRECEDINGy1 FOLLOWINGsiempre incluyen por completo los grupos adyacentes, independientemente de los huecos entre los valores deorder.
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.