Inilah yang saya sebut masalah "terbesar-n-per-grup". Itu muncul beberapa kali per minggu di StackOverflow.
Saya memecahkan masalah jenis ini menggunakan teknik gabungan luar:
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;
Ini hanya akan mengembalikan satu baris untuk setiap nama pengguna -- baris dengan nilai terbesar di ScrapeDate
kolom. Itulah gunanya gabungan luar, untuk mencoba untuk mencocokkan s1
dengan beberapa baris lain s2
dengan nama pengguna yang sama dan tanggal yang lebih besar. Jika tidak ada baris seperti itu, gabungan luar mengembalikan NULL untuk semua kolom s2
, dan kemudian kita tahu s1
sesuai dengan baris dengan tanggal terbesar untuk nama pengguna tersebut.
Ini juga akan berfungsi saat Anda sedang menyelesaikan pengikisan sebagian.
Teknik ini tidak harus secepat solusi CTE dan RANKING yang diberikan oleh jawaban lain. Anda harus mencoba keduanya dan melihat mana yang lebih cocok untuk Anda. Alasan saya lebih memilih solusi saya adalah karena solusi ini bekerja dalam semua jenis SQL.