sql >> Base de Datos >  >> RDS >> Mysql

SQL selecciona solo filas con valor máximo en una columna

A primera vista...

Todo lo que necesitas es un GROUP BY cláusula con el MAX función agregada:

SELECT id, MAX(rev)
FROM YourTable
GROUP BY id

Nunca es tan simple, ¿verdad?

Me acabo de dar cuenta de que necesitas el content columna también.

Esta es una pregunta muy común en SQL:encuentre los datos completos para la fila con algún valor máximo en una columna por algún identificador de grupo. Escuché eso mucho durante mi carrera. De hecho, fue una de las preguntas que respondí en la entrevista técnica de mi trabajo actual.

De hecho, es muy común que la comunidad de Stack Overflow haya creado una sola etiqueta solo para tratar preguntas como esa: .

Básicamente, tiene dos enfoques para resolver ese problema:

Unirse con group-identifier, max-value-in-group Subconsulta

En este enfoque, primero encuentra el group-identifier, max-value-in-group (ya resuelto arriba) en una subconsulta. Luego, une su tabla a la subconsulta con igualdad en ambos group-identifier y max-value-in-group :

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

Unión izquierda con uno mismo, ajuste de condiciones y filtros de unión

En este enfoque, se dejó unir la mesa consigo misma. La igualdad va en el group-identifier . Luego, 2 movimientos inteligentes:

  1. La segunda condición de combinación es tener un valor del lado izquierdo menor que el valor de la derecha
  2. Cuando realice el paso 1, las filas que realmente tienen el valor máximo tendrán NULL en el lado derecho (es un LEFT JOIN , ¿recordar?). Luego, filtramos el resultado unido, mostrando solo las filas donde el lado derecho es NULL .

Entonces terminas con:

SELECT a.*
FROM YourTable a
LEFT OUTER JOIN YourTable b
    ON a.id = b.id AND a.rev < b.rev
WHERE b.id IS NULL;

Conclusión

Ambos enfoques brindan exactamente el mismo resultado.

Si tiene dos filas con max-value-in-group para group-identifier , ambas filas estarán en el resultado en ambos enfoques.

Ambos enfoques son compatibles con SQL ANSI, por lo tanto, funcionarán con su RDBMS favorito, independientemente de su "sabor".

Ambos enfoques también son amigables con el rendimiento, sin embargo, su kilometraje puede variar (RDBMS, estructura de base de datos, índices, etc.). Entonces, cuando elige un enfoque sobre el otro, benchmark . Y asegúrese de elegir el que tenga más sentido para usted.