Como posso selecionar todas as entradas com a versão mais alta?

Eu tenho uma tabela chamada documents que possui os campos id, title, version e content.

Agora quero obter todos os ids (ou linhas) para cada título com a versão mais alta.

Suponha que eu tenha os seguintes dados:

+----+-------+---------+---------+
| 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  |
+----+-------+---------+---------+

Quero receber os IDs 4,6,7 ou as linhas inteiras para essas entradas.

O desempenho não é um problema, pois haverá apenas algumas centenas de entradas.

0
adicionado editado
Visualizações: 1
Neste caso eu uso o Sqlite3
adicionado o autor ayckoster, fonte
Você pode agrupá-los. Um ótimo exemplo está aqui: stackoverflow.com/questions/3998529/…
adicionado o autor David Manheim, fonte
Qual RDBMS você está usando?
adicionado o autor Philip Kelley, fonte

4 Respostas

Isto irá obter os IDs que você deseja:

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

Este é um grupo simples por:

select max(version)
from documents
group by title

Você pode se juntar aos documentos, se desejar, para obter as informações completas do documento.

0
adicionado

Para recuperar as linhas inteiras, você precisa GROUP BY version com um agregado MAX() e unir isso como uma subconsulta em relação à tabela inteira para extrair as colunas restantes. A condição JOIN precisará ser contra a combinação de title, version uma vez que juntos identificam unicamente a maior versão de um título.

O seguinte deve funcionar independentemente do RDBMS que você está usando:

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
adicionado

E se:

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