これは、私が「グループあたり最大 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;
これにより、ユーザー名ごとに 1 つの行のみが返されます。つまり、ScrapeDate
で最大の値を持つ行です。 桁。それが外部結合の目的です。試す s1
に一致する 他の行 s2
と 同じユーザー名で日付が大きくなります。そのような行がない場合、外部結合は s2
のすべての列に対して NULL を返します。 、そして s1
がわかります その特定のユーザー名の最大の日付を持つ行に対応します。
これは、部分的に完了したスクレイプが進行中の場合にも機能するはずです。
この手法は、他の回答が提供した CTE および RANKING ソリューションほど高速であるとは限りません。両方を試して、どちらがより効果的かを確認してください。私がこのソリューションを好む理由は、それがどのような SQL でも機能するからです。