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:n-mayores-por-grupo .
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:
- La segunda condición de combinación es tener un valor del lado izquierdo menor que el valor de la derecha
- Cuando realice el paso 1, las filas que realmente tienen el valor máximo tendrán
NULL
en el lado derecho (es unLEFT JOIN
, ¿recordar?). Luego, filtramos el resultado unido, mostrando solo las filas donde el lado derecho esNULL
.
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.