Wie kann ich alle Einträge mit der höchsten Version auswählen?

Ich habe eine Tabelle namens documents mit den Feldern id, title, version und content.

Jetzt möchte ich alle IDs (oder Zeilen) für jeden Titel mit der höchsten Version erhalten.

Angenommen, ich habe folgende Daten:

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

Ich möchte entweder die IDs 4,6,7 oder die ganzen Zeilen für diese Einträge erhalten.

Leistung ist kein Problem, da es nur ein paar hundert Einträge geben wird.

0
hinzugefügt bearbeitet
Ansichten: 1
In diesem Fall verwende ich Sqlite3
hinzugefügt der Autor ayckoster, Quelle
Sie können sie gruppieren. Ein gutes Beispiel ist hier: stackoverflow.com/questions/3998529/…
hinzugefügt der Autor David Manheim, Quelle
Welche RDBMS verwenden Sie?
hinzugefügt der Autor Philip Kelley, Quelle

4 Antworten

Dies wird die gewünschten IDs erhalten:

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

Dies ist eine einfache Gruppe von:

select max(version)
from documents
group by title

Wenn Sie möchten, können Sie sich den Dokumenten erneut anschließen, um die vollständigen Dokumentinformationen zu erhalten.

0
hinzugefügt

Um die gesamten Zeilen abzurufen, müssen Sie GROUP BY-Version mit einem MAX() -Aggregat verknüpfen und als Unterabfrage für die gesamte Tabelle verwenden, um die verbleibenden Spalten einzubeziehen. Die Bedingung JOIN muss gegen die Kombination von title, version sein, da sie zusammen die beste Version eines Titels eindeutig identifizieren.

Folgendes sollte unabhängig von dem verwendeten RDBMS funktionieren:

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
hinzugefügt

Wie wäre es mit:

SELECT * FROM dataz
WHERE version IN (
  SELECT TOP 1 version
  FROM dataz
  ORDER BY version DESC
)
0
hinzugefügt