SQL: Seleccionar filas con valor máximo por grupo

Posted on Wed 21 October 2015 in SQL

Un problema común en SQL: ¿cómo seleccionar las filas completas que contienen el valor máximo de una columna para cada grupo? No solo el valor máximo, sino la fila entera.

El problema

Dado una tabla con id y rev (revisión), queremos obtener la fila completa con la rev más alta para cada id.

Solución 1: Subquery con IN

SELECT * 
FROM YourTable 
WHERE (id, rev) IN (
    SELECT id, MAX(rev)
    FROM YourTable
    GROUP BY id
)

Ventajas: Simple y legible
Desventajas: Puede ser lento en tablas grandes

Solución 2: Join con subquery

SELECT a.*
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) as maxrev
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.maxrev

Ventajas: Mejor rendimiento que IN
Desventajas: Más verboso

Solución 3: Window Functions (MySQL 8+)

SELECT *
FROM (
    SELECT id, rev, 
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) ranked_order
    FROM YourTable
) a
WHERE a.ranked_order = 1

Ventajas: Más eficiente para datasets grandes
Desventajas: Requiere versiones modernas de SQL

Consideraciones de rendimiento

  • Window functions suelen ser las más eficientes
  • Joins balancean legibilidad y rendimiento
  • Subqueries con IN son las más simples pero menos escalables

¿Cuándo usar cada una?

  • Subquery: Tablas pequeñas, código simple
  • Join: Balance entre rendimiento y compatibilidad
  • Window functions: Datasets grandes, SQL moderno disponible

El patrón más robusto y moderno son las window functions, que además permiten manejar empates y casos edge más elegantemente.

Fuente original: Stack Overflow