Isso é o que eu chamo de problema do "maior n-por-grupo". Ele aparece várias vezes por semana no StackOverflow.
Eu resolvo esse tipo de problema usando uma técnica de junção externa:
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;
Isso retornará apenas uma linha para cada nome de usuário -- a linha com o maior valor no
ScrapeDate
coluna. É para isso que serve a junção externa, para tentar para corresponder a s1
com alguma outra linha s2
com o mesmo nome de usuário e uma data maior. Se não houver tal linha, a junção externa retornará NULL para todas as colunas de s2
, e então sabemos s1
corresponde à linha com a maior data para esse nome de usuário. Isso também deve funcionar quando você tiver uma raspagem parcialmente concluída em andamento.
Essa técnica não é necessariamente tão rápida quanto as soluções CTE e RANKING que outras respostas deram. Você deve experimentar os dois e ver o que funciona melhor para você. A razão pela qual prefiro minha solução é que ela funciona em qualquer tipo de SQL.