Das nenne ich das „größte-n-pro-Gruppe“-Problem. Es erscheint mehrmals pro Woche auf StackOverflow.
Ich löse diese Art von Problem mit einer Outer-Join-Technik:
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;
Dadurch wird nur eine Zeile für jeden Benutzernamen zurückgegeben – die Zeile mit dem höchsten Wert im ScrapeDate
Säule. Dafür ist der Outer Join da, um es auszuprobieren passend zu s1
mit einer anderen Zeile s2
mit demselben Benutzernamen und einem höheren Datum. Wenn es keine solche Zeile gibt, gibt der äußere Join NULL für alle Spalten von s2
zurück , und dann kennen wir s1
entspricht der Zeile mit dem größten Datum für diesen angegebenen Benutzernamen.
Dies sollte auch funktionieren, wenn Sie ein teilweise abgeschlossenes Scraping im Gange haben.
Diese Technik ist nicht unbedingt so schnell wie die CTE- und RANKING-Lösungen, die andere Antworten gegeben haben. Sie sollten beide ausprobieren und sehen, was für Sie besser funktioniert. Der Grund, warum ich meine Lösung bevorzuge, ist, dass sie in jeder SQL-Variante funktioniert.