Vid första anblicken...
Allt du behöver är en GROUP BY
sats med MAX
aggregatfunktion:
SELECT id, MAX(rev)
FROM YourTable
GROUP BY id
Det är aldrig så enkelt, eller hur?
Jag märkte precis att du behöver content
kolumn också.
Detta är en mycket vanlig fråga i SQL:hitta hela data för raden med något maxvärde i en kolumn per gruppidentifierare. Det har jag hört mycket under min karriär. Egentligen var det en av frågorna jag svarade på i min nuvarande jobbs tekniska intervju.
Det är faktiskt så vanligt att Stack Overflow-communityt har skapat en enda tagg bara för att hantera sådana frågor:bästa-n-per-grupp .
I grund och botten har du två metoder för att lösa det problemet:
Gå med enkel group-identifier, max-value-in-group
Underfråga
I detta tillvägagångssätt hittar du först group-identifier, max-value-in-group
(redan löst ovan) i en underfråga. Sedan ansluter du din tabell till underfrågan med likhet på båda group-identifier
och 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
Vänster Går med själv, justerar sammanfogningsvillkor och filter
I detta tillvägagångssätt lämnade du gå med i bordet med sig själv. Jämlikhet går i group-identifier
. Sedan två smarta drag:
- Det andra kopplingsvillkoret har ett värde på vänster sida som är mindre än det högra värdet
- När du gör steg 1 kommer raden/raderna som faktiskt har maxvärdet att ha
NULL
på höger sida (det är enLEFT JOIN
, kom ihåg?). Sedan filtrerar vi det sammanfogade resultatet och visar endast raderna där den högra sidan ärNULL
.
Så du slutar med:
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;
Slutsats
Båda metoderna ger exakt samma resultat.
Om du har två rader med max-value-in-group
för group-identifier
, kommer båda raderna att finnas i resultatet i båda metoderna.
Båda tillvägagångssätten är SQL ANSI-kompatibla, så de kommer att fungera med din favorit RDBMS, oavsett dess "smak".
Båda metoderna är också prestandavänliga, men din körsträcka kan variera (RDBMS, DB-struktur, index, etc.). Så när du väljer ett tillvägagångssätt framför det andra, benchmark . Och se till att du väljer den som är mest meningsfull för dig.