Op het eerste gezicht...
Alles wat je nodig hebt is een GROUP BY
clausule met de MAX
aggregatiefunctie:
SELECT id, MAX(rev)
FROM YourTable
GROUP BY id
Zo eenvoudig is het toch niet?
Ik heb net gemerkt dat je de content
nodig hebt kolom ook.
Dit is een veel voorkomende vraag in SQL:vind de volledige gegevens voor de rij met een maximale waarde in een kolom per groepsidentificatie. Dat heb ik tijdens mijn carrière veel gehoord. Het was eigenlijk een van de vragen die ik beantwoordde in het technische sollicitatiegesprek van mijn huidige baan.
Het is eigenlijk zo gewoon dat de Stack Overflow-community een enkele tag heeft gemaakt om met dit soort vragen om te gaan:grootste-n-per-groep .
In principe heb je twee benaderingen om dat probleem op te lossen:
Deelnemen met eenvoudige group-identifier, max-value-in-group
Subquery
In deze benadering vindt u eerst de group-identifier, max-value-in-group
(hierboven al opgelost) in een subquery. Vervolgens voegt u uw tabel toe aan de subquery met gelijkheid op beide group-identifier
en 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
Links Meedoen met jezelf, voorwaarden en filters aanpassen
In deze benadering ging je met zichzelf aan tafel. Gelijkheid gaat in de group-identifier
. Dan 2 slimme zetten:
- De tweede voorwaarde voor samenvoegen is dat de linkerwaarde kleiner is dan de rechterwaarde
- Als je stap 1 uitvoert, hebben de rij(en) die daadwerkelijk de maximale waarde hebben
NULL
aan de rechterkant (het is eenLEFT JOIN
, onthouden?). Vervolgens filteren we het samengevoegde resultaat, waarbij alleen de rijen worden weergegeven waarvan de rechterkantNULL
. is .
Dus je eindigt met:
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;
Conclusie
Beide benaderingen brengen exact hetzelfde resultaat.
Als je twee rijen hebt met max-value-in-group
voor group-identifier
, beide rijen komen in beide benaderingen in het resultaat voor.
Beide benaderingen zijn SQL ANSI-compatibel en werken dus met uw favoriete RDBMS, ongeacht de "smaak".
Beide benaderingen zijn ook prestatievriendelijk, maar uw kilometerstand kan variëren (RDBMS, DB-structuur, indexen, enz.). Dus als u de ene benadering boven de andere kiest, benchmark . En zorg ervoor dat je degene kiest die voor jou het meest logisch is.