Това е, което аз наричам проблем "най-голямото-n-на-група". Появява се няколко пъти седмично в StackOverflow.
Решавам този тип проблем с помощта на техника за външно свързване:
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;
Това ще върне само един ред за всяко потребителско име -- редът с най-голяма стойност в ScrapeDate
колона. За това е външното съединение, за да опитате за съвпадение на s1
с някой друг ред s2
със същото потребителско име и по-голяма дата. Ако няма такъв ред, външното съединение връща NULL за всички колони на s2
и тогава знаем s1
съответства на реда с най-голямата дата за даденото потребителско име.
Това също трябва да работи, когато имате частично завършено остъргване в ход.
Тази техника не е непременно толкова бърза, колкото CTE и RANKING решенията, дадени от други отговори. Трябва да опитате и двете и да видите кое работи по-добре за вас. Причината, поради която предпочитам моето решение, е, че то работи във всеки вариант на SQL.