Dette er, hvad jeg kalder det "største-n-per-gruppe"-problem. Det kommer op flere gange om ugen på StackOverflow.
Jeg løser denne type problemer ved at bruge en ydre forbindelsesteknik:
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;
Dette returnerer kun én række for hvert brugernavn -- rækken med den største værdi i ScrapeDate
kolonne. Det er det, den ydre sammenføjning er til for at prøve for at matche s1
med en anden række s2
med samme brugernavn og en større dato. Hvis der ikke er en sådan række, returnerer den ydre joinforbindelse NULL for alle kolonner i s2
, og så kender vi s1
svarer til rækken med den største dato for det pågældende brugernavn.
Dette burde også virke, når du har en delvist afsluttet skrabe i gang.
Denne teknik er ikke nødvendigvis så hurtig som de CTE- og RANKING-løsninger, som andre svar har givet. Du bør prøve begge dele og se, hvad der virker bedre for dig. Grunden til, at jeg foretrækker min løsning, er, at den fungerer i enhver variant af SQL.