La función de agregación SUM() suma los valores de todo el grupo de filas en el conjunto de resultados, devolviendo un solo valor para cada grupo (o para toda la consulta). La función de ventana SUM() permite calcular la suma sobre una "ventana" de valores, definida dentro del SELECT (mediante OVER()), donde cada fila se mantiene en el resultado y tiene acceso al resultado agregado de su propia "ventana". Esto es particularmente útil para obtener totales intermedios por grupos.
Ejemplo de función de agregación:
SELECT department_id, SUM(salary) FROM employees GROUP BY department_id;
Ejemplo de función de ventana:
SELECT department_id, salary, SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) FROM employees;
“¿Se puede obtener una suma acumulativa («corriente») en una columna solo con la función de agregación GROUP BY?”
Respuesta: ¡No! GROUP BY solo proporciona agregados finales, la suma corriente requiere funciones de ventana, o subconsultas complejas, que son más complicadas y lentas.
Ejemplo:
SELECT salary, SUM(salary) OVER (ORDER BY hire_date) AS running_total FROM employees;
Historia
En el informe de transacciones, la suma corriente se implementó mediante múltiples subconsultas correlacionadas. Con el aumento de la tabla, el rendimiento se redujo decenas de veces. Pasamos a la función de ventana y todo volvió a tardar segundos.
Historia
Intentar hacer un análisis complejo con totales por grupos a través de GROUP BY resultó en varias etapas de exportación y procesamiento en software externo. Las funciones de ventana permitieron crear el informe necesario en una sola consulta SQL.
Historia
Un analista escribió una consulta con funciones de ventana, utilizando una PARTITION BY incorrecta — los resultados para diferentes grupos se mezclaron. Resultado: informes distorsionados. Después de corregir la partición por grupos, los datos se volvieron correctos.