Я сейчас работаю над запросом, чтобы получить рейтинг моих пользователей. У меня есть две таблицы для пользователей, а другая для прибыли, где я сохраняю сумму и идентификатор пользователя, к которому относится. Получая общую прибыль, получаемую пользователем, мне нужно создать ранг с тремя пользователями, пользователь в следующем более ранжированном положении для моего пользователя, моего пользователя и пользователя в следующей ниже ранговой позиции для моего пользователя. Например:Как ранжировать пользователей и получать подмножество из этого ранга с моим пользователем и выше и ниже пользователем по рангу позиции
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
В этом случае мой пользователь Kobe Bryant я должен был бы получить звание с Майкл Джордан, Кобе Брайант и Фил Джексон.
Если мой пользователь - Майк Бибби, мне нужно будет получить звание Михаила Джордана, Майка Бэбби и Фила Джексона.
До сих пор у меня есть запрос, который возвращает мне полный ранг со всеми пользователями, но теперь я не знаю, что является хорошим способом получить трех пользователей, которых я хочу. Я попытался сделать это с помощью ruby, но я думаю, было бы лучше, если бы я делал всю эту обработку в БД.
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
Кто лучше функций окна может ответить, но я думаю, что LAG() и LEAD() будет то, что вы получите после. http://www.postgresql.org/docs/9.1/static/functions-window.html – bma
, так что вы хотите, чтобы Коби Брайант в вашем примере имел ранг 3 или 2? –
Ранг Коби Брайанта должен быть 3, потому что он связан с Майком Бибби, но в моем последнем звании я не хочу показывать галстуки и хочу только получить пользователя с более высоким рангом и с более низким рангом – Eddie