sql >> データベース >  >> RDS >> Sqlserver

DB 内のユーザーのランキングを照会するにはどうすればよいですか?ただし、各ユーザーの最新のエントリのみを考慮しますか?

    これは、私が「グループあたり最大 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 でも機能するからです。



    1. 複数の外部キーを追加しようとすると、SQLにエラーが表示されます

    2. MySQLはwhileループで複数のレコードを挿入します

    3. ビット列のインデックス

    4. asp.netイメージコントロールでmysqlblobイメージを表示する方法は?