Dit is wat ik het "grootste-n-per-groep"-probleem noem. Het verschijnt meerdere keren per week op StackOverflow.
Ik los dit soort problemen op met behulp van een outer join-techniek:
SELECT s1.*, s1.wins / s1.losses AS win_loss_ratio
FROM Scrape s1
LEFT OUTER JOIN Scrape s2
ON (s1.username = s2.username AND s1.ScrapeDate < s2.ScrapeDate)
WHERE s2.username IS NULL
ORDER BY win_loss_ratio DESC;
Dit retourneert slechts één rij voor elke gebruikersnaam -- de rij met de grootste waarde in de ScrapeDate
kolom. Daar is de outer join voor, om te proberen overeenkomen met s1
met een andere rij s2
met dezelfde gebruikersnaam en een grotere datum. Als zo'n rij niet bestaat, retourneert de outer join NULL voor alle kolommen van s2
, en dan weten we s1
komt overeen met de rij met de hoogste datum voor die gegeven gebruikersnaam.
Dit zou ook moeten werken als je een gedeeltelijk voltooide scraping aan de gang hebt.
Deze techniek is niet per se zo snel als de CTE- en RANKING-oplossingen die andere antwoorden hebben gegeven. Je moet beide proberen en kijken wat voor jou het beste werkt. De reden dat ik de voorkeur geef aan mijn oplossing, is dat deze in elke vorm van SQL werkt.