¿Cómo puedo seleccionar todas las entradas con la versión más alta?

Tengo una tabla llamada documentos que tiene los campos id, título, versión y contenido.

Ahora quiero obtener todos los ID (o filas) para cada título con la versión más alta.

Supongamos que tengo los siguientes datos:

+----+-------+---------+---------+
| id | title | version | content |
+----+-------+---------+---------+
|  2 | foo   |       1 | abc1    |
|  3 | foo   |       2 | abc2    |
|  4 | foo   |       3 | abc3    |
|  5 | bar   |       1 | abcd1   |
|  6 | bar   |       2 | abcd2   |
|  7 | baz   |       1 | abcde1  |
+----+-------+---------+---------+

Quiero recibir los ID 4,6,7 o las filas completas para estas entradas.

El rendimiento no es un problema, ya que solo habrá unas pocas entradas.

0
En este caso, uso Sqlite3
agregado el autor ayckoster, fuente
Puedes agruparlos. Un gran ejemplo está aquí: stackoverflow.com/questions/3998529/…
agregado el autor David Manheim, fuente
¿Qué RDBMS estás usando?
agregado el autor Philip Kelley, fuente

4 Respuestas

Esto obtendrá los ID que desee:

  Select max(id) as id from documents
group by title
  having count(1) = max(version)
order by id
0
agregado

Este es un grupo simple por:

select max(version)
from documents
group by title

Puede volver a unirse a los documentos, si lo desea, para obtener la información completa del documento.

0
agregado

Para recuperar las filas completas, necesita GROUP BY versión con un agregado MAX() , y unir eso como una subconsulta con la tabla completa para obtener las columnas restantes. La condición JOIN tendrá que estar en contra de la combinación de título , versión ya que juntos identifican de manera única la versión más grande de un título.

Lo siguiente debería funcionar independientemente del RDBMS que está utilizando:

SELECT 
  documents.id,
  documents.title, 
  documents.version,
  documents.content
FROM 
  documents
  JOIN (
    /* subquery pulls greatest version per title */
    SELECT
      title,
      MAX(version) AS version
    FROM documents
    GROUP BY title
    /* title, version pair is joined back against the main table */
  ) maxversions ON (documents.title = maxversions.title AND documents.version = maxversions.version)
0
agregado

Qué tal si:

SELECT * FROM dataz
WHERE version IN (
  SELECT TOP 1 version
  FROM dataz
  ORDER BY version DESC
)
0
agregado