CodeGym /Cursos /SQL SELF /Comparación de funciones de ventana con funciones agregad...

Comparación de funciones de ventana con funciones agregadas: GROUP BY vs PARTITION BY

SQL SELF
Nivel 30 , Lección 0
Disponible

A primera vista, las funciones de ventana y las funciones agregadas parecen herramientas parecidas para analizar y procesar datos. Al fin y al cabo, ambas hacen cálculos como suma, promedio, ranking, etc. Pero vamos a ver en qué se diferencian realmente.

Funciones agregadas (GROUP BY)

Las funciones agregadas funcionan así:

  • Agrupan filas según las columnas que indiques.
  • Después de agrupar, cada grupo se convierte en una sola fila en el resultado.
  • Ejemplo: quieres saber el ingreso total por cada región.
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

Peculiaridad: GROUP BY "comprime" los datos. Si usas agrupación, todas las filas que pertenecen a un grupo desaparecen — solo queda el resultado de la agregación.

Funciones de ventana (PARTITION BY)

Las funciones de ventana, en cambio:

  • Mantienen la estructura original de los datos (¡nada de comprimir ni hacer desaparecer filas!).
  • Pueden hacer cálculos dentro de "ventanas" — grupos lógicos de filas.

Ejemplo: quieres saber la proporción de ventas de cada ciudad respecto al total de ventas de su región, pero sin perder ningún dato.

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;

Peculiaridad: usar funciones de ventana no elimina filas, solo añade nuevos valores calculados a cada fila.

Ejemplo: SUM() con GROUP BY vs SUM() con PARTITION BY

Para entender mejor la diferencia, vamos a ver cómo funciona SUM() en ambos casos. Imagina que tenemos una tabla sales_data así:

region city sales
North CityA 100
North CityB 150
South CityC 200
South CityD 250

Sumar usando GROUP BY

Queremos saber el total de ventas por cada región:

SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

El resultado será así:

region total_sales
North 250
South 450

¿Qué pasó aquí? Las filas se agruparon por region y cada grupo se "comprimió" en una sola fila con la suma de ventas.

Sumar usando PARTITION BY

Ahora hacemos lo mismo pero con una función de ventana:

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales_by_region
FROM sales_data;

Resultado:

region city sales total_sales_by_region
North CityA 100 250
North CityB 150 250
South CityC 200 450
South CityD 250 450

¿Qué pasó aquí? PARTITION BY no "comprimió" las filas. En vez de eso, calculó la suma dentro de cada ventana (cada región es una ventana aparte).

¿Cuándo usar GROUP BY y cuándo PARTITION BY?

GROUP BY: ideal para informes finales

GROUP BY es útil cuando quieres reducir la cantidad de datos y obtener resultados finales a nivel de grupo. Por ejemplo:

  • Ventas totales por mes.
  • Contar el número de pedidos por categoría de producto.

Ejemplo:

SELECT category, COUNT(*) AS total_orders
FROM orders
GROUP BY category;

PARTITION BY: perfecto para análisis y detalle

PARTITION BY va bien cuando necesitas mantener todas las filas y además calcular algo para cada una. Por ejemplo:

  • Calcular la proporción de ventas de cada producto en su categoría.
  • Numerar filas dentro de cada grupo.

Ejemplo de cálculo de porcentaje de ventas:

SELECT
    category,
    product,
    sales,
    ROUND(
        (sales * 100.0) / SUM(sales) OVER (PARTITION BY category),
        2
    ) AS sales_percentage
FROM sales_data;

Ejemplo: usando varias funciones de ventana

Una de las ventajas de las funciones de ventana es que puedes hacer varios cálculos a la vez. Por ejemplo:

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales,
    RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS sales_rank
FROM sales_data;

Resultado:

region city sales total_sales sales_rank
North CityB 150 250 1
North CityA 100 250 2
South CityD 250 450 1
South CityC 200 450 2

Ventajas de las funciones de ventana sobre GROUP BY

Mantener los datos originales: GROUP BY "comprime" las filas, pero las funciones de ventana te dejan la estructura original de la tabla.

Varios cálculos en una sola consulta: Puedes usar varias funciones de ventana con diferentes parámetros de PARTITION BY y ORDER BY, manteniendo los datos.

Flexibilidad de análisis: Las funciones de ventana te dejan ajustar los cálculos a lo que necesites: sumas acumuladas, rankings, porcentajes y mucho más.

Ejemplo de flexibilidad

Vamos a combinar varias funciones:

SELECT
    region,
    city,
    sales,
    SUM(sales) OVER (PARTITION BY region) AS total_sales,
    AVG(sales) OVER (PARTITION BY region) AS avg_sales,
    RANK() OVER (PARTITION BY region ORDER BY sales DESC) AS rank
FROM sales_data;

Resultado:

region city sales total_sales avg_sales rank
North CityB 150 250 125.0 1
North CityA 100 250 125.0 2
South CityD 250 450 225.0 1
South CityC 200 450 225.0 2

Limitaciones y errores típicos

Un error muy común es intentar usar PARTITION BY cuando en realidad necesitas "comprimir" los datos. Por ejemplo, en vez de esto:

SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;

Algunos intentan escribir así:

SELECT
    region,
    SUM(sales) OVER (PARTITION BY region) AS total_sales
FROM sales_data;

Pero esto te va a devolver todas las filas, sin reducir la cantidad de datos (y eso no siempre es lo que quieres).

Ahora ya sabes cuándo usar GROUP BY y cuándo funciones de ventana. Es como elegir entre un martillo y un destornillador: los dos sirven para clavar... pero de formas distintas.

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION