Detta är vad jag kallar det "största-n-per-grupp"-problemet. Det kommer upp flera gånger i veckan på StackOverflow.
Jag löser den här typen av problem med en yttre sammanfogningsteknik:
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;
Detta returnerar endast en rad för varje användarnamn -- raden med det största värdet i ScrapeDate
kolumn. Det är vad den yttre sammanfogningen är till för, att prova för att matcha s1
med någon annan rad s2
med samma användarnamn och ett större datum. Om det inte finns någon sådan rad, returnerar den yttre kopplingen NULL för alla kolumner i s2
, och då vet vi s1
motsvarar raden med det största datumet för det angivna användarnamnet.
Detta bör också fungera när du har en delvis färdig skrapning på gång.
Den här tekniken är inte nödvändigtvis lika snabb som de CTE- och RANKING-lösningar som andra svar har gett. Du bör prova båda och se vad som fungerar bättre för dig. Anledningen till att jag föredrar min lösning är att den fungerar i alla varianter av SQL.