To właśnie nazywam problemem „największej liczby na grupę”. Pojawia się kilka razy w tygodniu na StackOverflow.
Rozwiązuję tego typu problem za pomocą techniki łączenia zewnętrznego:
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;
To zwróci tylko jeden wiersz dla każdej nazwy użytkownika -- wiersz z największą wartością w ScrapeDate
kolumna. Do tego służy sprzężenie zewnętrzne, aby spróbować aby dopasować s1
z innym wierszem s2
z tą samą nazwą użytkownika i większą datą. Jeśli nie ma takiego wiersza, sprzężenie zewnętrzne zwraca NULL dla wszystkich kolumn s2
, a następnie znamy s1
odpowiada wierszowi z największą datą dla danej nazwy użytkownika.
Powinno to również działać, gdy trwa częściowo ukończone scrapowanie.
Ta technika niekoniecznie jest tak szybka, jak rozwiązania CTE i RANKING, które podały inne odpowiedzi. Powinieneś spróbować obu i zobaczyć, co działa lepiej dla Ciebie. Powodem, dla którego wolę moje rozwiązanie, jest to, że działa ono w dowolnym smaku SQL.