2

現在、ユーザーのランキングを取得するためのクエリに取り組んでいます。ユーザー用と利益用の 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 を使用しています

4

2 に答える 2

1
with s as (
    select
        users.id, users.name, total_profit,
        rank() over(order by total_profit desc) as r
    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
), u as (
    select r from s where name = 'Kobe Bryant'
)
select distinct on (r) id, name, total_profit, r
from s
where
    name = 'Kobe Bryant'
    or r in (
        (select r from u) - 1, (select r from u) + 1
    )
order by r;
于 2013-08-16T17:14:13.043 に答える