現在、ユーザーのランキングを取得するためのクエリに取り組んでいます。ユーザー用と利益用の 2 つのテーブルがあり、金額と関連するユーザー ID を保存します。ユーザーによって生成された利益の合計を取得することにより、3 人のユーザーでランクを構築する必要があります。私のユーザーの次に高いランクの位置にあるユーザー、私のユーザー、および私のユーザーの次に低いランクの位置にあるユーザーです。例えば:
id | name | total_profit | rank
-------+-----------------------------+--------------+------
10312 | John Doe | 7000.0 | 1
10329 | Michael Jordan | 5000.0 | 2
10333 | Kobe Bryant | 4000.0 | 3
10327 | Mike Bibby | 4000.0 | 3
10331 | Phil Jackson | 1000.0 | 4
これで、ユーザーがコービー・ブライアントである場合、マイケル・ジョーダン、コービー・ブライアント、フィル・ジャクソンとランク付けする必要があります。
私のユーザーが Mike Bibby の場合、Michael Jordan、Mike Bybby、Phil Jackson とランク付けする必要があります。
これまで、すべてのユーザーで完全なランクを返すクエリがありましたが、必要な 3 人のユーザーを取得するための良い方法がわかりません。ruby でやってみましたが、DB で処理した方がいいと思います。
SELECT users.id, users.name, total_profit, rank() OVER(ORDER BY total_profit DESC)
FROM users
INNER JOIN (SELECT sum(profits.amount) AS total_profit, investor_id
FROM profits GROUP BY profits.investor_id) profits ON profits.investor_id = users.id
ORDER BY total_profit DESC;
PostgresSQL 9.1.4 を使用しています