0Pricing
Coding Interview Prep · Lección

OVER, PARTITION BY y ORDER BY

Conozca la anatomía de una especificación de ventana y cómo las particiones reinician el cálculo

OVER, PARTITION BY y ORDER BY es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

Por qué los entrevistadores recurren a las funciones de ventana

Una función de ventana realiza un cálculo sobre un conjunto de filas relacionadas con la fila actual, sin agruparlas en una sola fila como hace GROUP BY. Esta propiedad es precisamente la razón por la que los entrevistadores las valoran: conserva todas las filas detalladas y, al mismo tiempo, obtiene junto a ellas un agregado, una posición o un total acumulado.

  • GROUP BY devuelve una fila por grupo.
  • Función de ventana devuelve todas las filas de entrada, con una columna calculada adicional.

Cuando un entrevistador dice «muestre cada empleado y el salario promedio de su departamento en la misma fila», está comprobando si utiliza una función de ventana en lugar de una autocombinación.

Anatomía de la cláusula OVER

Toda función de ventana va seguida de una cláusula OVER (...). La cláusula tiene tres partes opcionales, y nombrarlas con precisión causa una buena impresión en las entrevistas:

  • PARTITION BY — divide las filas en grupos; la función se reinicia en cada uno.
  • ORDER BY — ordena las filas dentro de cada partición (es necesario para las posiciones y los totales acumulados).
  • frame — limita las filas que intervienen en el cálculo (ROWS/RANGE).

Un OVER () vacío trata todo el conjunto de resultados como una sola partición.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

Ventana frente a agregado: la misma función, distinto resultado

La misma función de agregado se comporta de forma diferente cuando se utiliza como función de ventana. Compare conceptualmente las dos consultas siguientes.

  • AVG(salary) con GROUP BY department devuelve una fila por departamento.
  • AVG(salary) OVER (PARTITION BY department) devuelve todos los empleados, cada uno con el promedio de su departamento.

Consejo para la entrevista: destaque que la versión de ventana no requiere GROUP BY y no elimina las filas detalladas duplicadas.

-- Aggregate: collapses
SELECT department, AVG(salary)
FROM employees
GROUP BY department;

-- Window: preserves every row
SELECT department, name, AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees;

PARTITION BY: Reiniciar el cálculo

PARTITION BY es para las funciones de ventana lo que GROUP BY es para las funciones de agregación, con la diferencia de que no reduce las filas. Cada valor de partición distinto obtiene su propio cálculo independiente.

En el ejemplo, el número de fila vuelve a comenzar en 1 para cada departamento. Sin PARTITION BY, la numeración continuaría de forma ininterrumpida entre todos los empleados.

  • Puede particionar por una columna o por varias.
  • Sin PARTITION BY, hay una sola partición enorme (todo el conjunto).
SELECT
  department,
  name,
  ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
FROM employees;

ORDER BY dentro de OVER

El ORDER BY dentro de OVER no es lo mismo que el ORDER BY final de la consulta. Solo define la secuencia de filas dentro de cada partición sobre la que opera la función.

  • Las funciones de ranking (ROW_NUMBER, RANK) lo requieren: necesitan un orden para asignar el ranking.
  • Las funciones de agregación simples sobre una partición no lo necesitan, a menos que quiera un cálculo acumulado.

Un error frecuente en las entrevistas es confundir el ORDER BY de la ventana con el orden de presentación de la salida.

SELECT
  name,
  hire_date,
  ROW_NUMBER() OVER (ORDER BY hire_date) AS seniority_rank
FROM employees
ORDER BY name;  -- output order is independent of the window order

Combinar PARTITION BY y ORDER BY

La ventana de ranking clásica combina ambos elementos: PARTITION BY agrupa y, después, ORDER BY establece la secuencia dentro de cada grupo.

Lea la especificación siguiente así: «Dentro de cada departamento, ordene a los empleados por salario descendente y asígneles un número». La persona con el salario más alto de cada departamento obtiene el número de fila 1.

Esta única especificación es la base de los problemas más comunes de entrevistas sobre funciones de ventana, incluidos los de tipo top-N-per-group.

SELECT
  department,
  name,
  salary,
  ROW_NUMBER() OVER (
    PARTITION BY department
    ORDER BY salary DESC
  ) AS dept_salary_rank
FROM employees;

ORDER BY cambia el comportamiento de las agregaciones

Este es un detalle sutil que los entrevistadores suelen evaluar: añadir ORDER BY a una ventana de agregación la convierte en un cálculo acumulado, porque se activa un marco implícito («desde el inicio de la partición hasta la fila actual»).

  • SUM(x) OVER (PARTITION BY g) → el mismo total del grupo en todas las filas.
  • SUM(x) OVER (PARTITION BY g ORDER BY d) → un total acumulado hasta la fila actual.

Saber que ORDER BY añade implícitamente un marco distingue a los candidatos de nivel intermedio de los candidatos júnior.

SELECT
  account_id,
  txn_date,
  amount,
  SUM(amount) OVER (
    PARTITION BY account_id
    ORDER BY txn_date
  ) AS running_balance
FROM transactions;

Dónde se permiten las funciones de ventana

Las funciones de ventana solo pueden aparecer en la lista de SELECT y en la cláusula ORDER BY. No están permitidas en WHERE, GROUP BY ni HAVING.

La razón está relacionada con el orden lógico de ejecución: las funciones de ventana se evalúan después de que se hayan ejecutado WHERE, GROUP BY y HAVING. Las filas ya se han seleccionado antes de que la ventana las procese.

Por eso, para filtrar según un ranking se necesita una subconsulta o una CTE, un tema que se explica por completo en una lección posterior.

-- This FAILS: window function in WHERE
-- SELECT name FROM employees
-- WHERE ROW_NUMBER() OVER (ORDER BY salary) = 1;

-- This works: window in SELECT, filter outside
SELECT * FROM (
  SELECT name, ROW_NUMBER() OVER (ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

Varias funciones de ventana en una consulta

Puede usar varias funciones de ventana en el mismo SELECT, cada una con su propia especificación o con una especificación compartida. La base de datos las calcula en una sola pasada sobre los datos particionados.

Esto resulta útil en las entrevistas cuando necesita obtener a la vez un ranking y el promedio del departamento. Si dos funciones comparten una especificación, algunos dialectos permiten asignarle un nombre mediante una cláusula WINDOW para evitar repetirla.

SELECT
  name,
  department,
  salary,
  ROW_NUMBER() OVER w  AS rn,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg
FROM employees
WINDOW w AS (PARTITION BY department ORDER BY salary DESC);

Ejemplo resuelto: salario frente al promedio del departamento

Una pregunta frecuente para analistas es: «Enumere cada empleado con su salario, el promedio del departamento y la diferencia». Una expresión de ventana hace el trabajo principal; la aritmética se encarga del resto.

Observe que no hay ningún GROUP BY y que se conserva la fila de cada empleado. dept_avg se repite para todas las personas del mismo departamento, exactamente lo que permite hacer la comparación fila por fila.

SELECT
  name,
  department,
  salary,
  AVG(salary) OVER (PARTITION BY department) AS dept_avg,
  salary - AVG(salary) OVER (PARTITION BY department) AS diff_from_avg
FROM employees
ORDER BY department, salary DESC;

Errores comunes que vigilan los entrevistadores

Evite estas trampas cuando aparezcan las funciones de ventana:

  • Colocar una función de ventana en WHERE o HAVING: es ilegal; use una subconsulta.
  • Olvidar ORDER BY en una función de ranking: los resultados se vuelven arbitrarios.
  • Suponer que PARTITION BY reduce el número de filas: nunca lo hace.
  • Confundir el ORDER BY de la ventana con el orden final de la salida.
  • Añadir ORDER BY a una ventana de agregación sin darse cuenta de que se ha convertido en un total acumulado.

Comprobación rápida

Compruebe cuánto domina la especificación de ventana.

Repaso: la especificación de ventana

Ahora ya domina la estructura de OVER (...):

  • Las funciones de ventana conservan todas las filas mientras calculan valores sobre filas relacionadas.
  • PARTITION BY agrupa y reinicia el cálculo; nunca elimina filas.
  • ORDER BY establece la secuencia de las filas dentro de una partición; las funciones de ranking lo requieren y convierte las agregaciones en cálculos acumulados.
  • Las funciones de ventana solo son válidas en SELECT y ORDER BY: nunca en WHERE/HAVING.

A continuación, asignará números de secuencia deterministas con ROW_NUMBER.

Preguntas frecuentes

¿La lección «OVER, PARTITION BY y ORDER BY» es gratis?

Sí — el texto completo de «OVER, PARTITION BY y ORDER BY» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «OVER, PARTITION BY y ORDER BY»?

Conozca la anatomía de una especificación de ventana y cómo las particiones reinician el cálculo Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «OVER, PARTITION BY y ORDER BY»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. OVER, PARTITION BY y ORDER BY
  2. ROW_NUMBER para secuencias únicas
  3. RANK frente a DENSE_RANK con empates
  4. Filtrar por un resultado de ventana
← Volver a Coding Interview Prep