sql >> Database >  >> RDS >> Mysql

SQL selecteer alleen rijen met maximale waarde in een kolom

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: .

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:

  1. De tweede voorwaarde voor samenvoegen is dat de linkerwaarde kleiner is dan de rechterwaarde
  2. Als je stap 1 uitvoert, hebben de rij(en) die daadwerkelijk de maximale waarde hebben NULL aan de rechterkant (het is een LEFT JOIN , onthouden?). Vervolgens filteren we het samengevoegde resultaat, waarbij alleen de rijen worden weergegeven waarvan de rechterkant NULL . 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.



  1. SQL Server-systeemdatabases – basisconcepten

  2. Specifieke pakketversies installeren met pip

  3. JPA flush vs commit

  4. Hoe kan ik alle rijen opvragen binnen een straal van 5 mijl van mijn coördinaten?