Đâ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.