Đây là những gì tôi gọi là vấn đề "lớn nhất-n-mỗi-nhóm". Nó xuất hiện vài lần mỗi tuần trên StackOverflow.
Tôi giải quyết loại vấn đề này bằng cách sử dụng kỹ thuật nối ngoài:
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;
Điều này sẽ chỉ trả về một hàng cho mỗi tên người dùng - hàng có giá trị lớn nhất trong ScrapeDate cột. Đó là những gì tham gia bên ngoài là để thử để khớp với s1 với một số hàng khác s2 với cùng một tên người dùng và một ngày lớn hơn. Nếu không có hàng như vậy, phép nối ngoài trả về NULL cho tất cả các cột của s2 và sau đó chúng ta biết s1 tương ứng với hàng có ngày lớn nhất cho tên người dùng đã cho đó.
Điều này cũng sẽ hiệu quả khi bạn đang hoàn thành một phần công việc.
Kỹ thuật này không nhất thiết phải nhanh như các giải pháp CTE và RANKING mà các câu trả lời khác đã đưa ra. Bạn nên thử cả hai và xem điều gì phù hợp hơn với bạn. Lý do tôi thích giải pháp của mình hơn là nó hoạt động trong bất kỳ phiên bản nào của SQL.