Cum pot selecta toate intrările cu cea mai înaltă versiune?

Am un tabel numit documents care conține ID-ul câmpului, titlul, versiunea și conținutul.

Acum vreau să obțin toate ID-urile (sau rândurile) pentru fiecare titlu cu cea mai mare versiune.

Să presupunem că am următoarele date:

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

Vreau să primesc fie ID-urile 4,6,7, fie toate rândurile pentru aceste intrări.

Performanța nu este o problemă, deoarece vor exista doar câteva sute de intrări.

0
În acest caz, folosesc Sqlite3
adăugat autor ayckoster, sursa
Le puteți grupa. Un exemplu excelent este aici: stackoverflow.com/questions/3998529/…
adăugat autor David Manheim, sursa
Ce RDBMS folosiți?
adăugat autor Philip Kelley, sursa

4 răspunsuri

Astfel veți obține ID-urile dorite:

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

Acesta este un grup simplu prin:

select max(version)
from documents
group by title

Puteți să vă înscrieți înapoi în documente, dacă doriți, pentru a obține informațiile complete despre document.

0
adăugat

Pentru a prelua toate rândurile, trebuie să GROUP BY versiune cu un agregat MAX() și să o asociați ca o subchetare față de întregul tabel pentru a trage în coloanele rămase. Condiția JOIN va trebui să fie împotriva combinației dintre title, version deoarece împreună acestea identifică în mod unic cea mai bună versiune a titlului.

Următoarele ar trebui să funcționeze independent de RDBMS pe care îl utilizați:

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
adăugat

Ce zici:

SELECT * FROM dataz
WHERE version IN (
  SELECT TOP 1 version
  FROM dataz
  ORDER BY version DESC
)
0
adăugat