SQL Состояние ранга - PullRequest
2 голосов
/ 15 марта 2020

Я использую этот код для выбора ранга для каждой базы данных в sql. Однако я не получаю желаемый результат.

БАЗА ДАННЫХ: КОД:

SELECT user_id,country,city,institute,  
RANK () OVER (PARTITION BY country ORDER BY up_vote+down_vote DESC) country_rank,
RANK() OVER (PARTITION BY city ORDER BY up_vote+down_vote DESC) city_rank,
RANK() OVER (PARTITION BY institute ORDER BY up_vote+down_vote DESC) institute_rank
FROM Users ;
FROM Users;
 user_id | country |  city   |      institute       | country_rank | city_rank | institute_rank
---------+---------+---------+----------------------+--------------+-----------+----------------
      17 | Canada  | Toronto | University of Ottawa |            1 |         1 |              1
      18 | Canada  | Ottawa  | University of Ottawa |            2 |         1 |              2
      16 | test123 | test123 | test123              |            1 |         1 |              1

Я просто хочу получить user_id = 18, поэтому я добавил WHERE user_id=18

Однако я получаю это в качестве результата

 user_id | country |  city  |      institute       | country_rank | city_rank | institute_rank
---------+---------+--------+----------------------+--------------+-----------+----------------
      18 | Canada  | Ottawa | University of Ottawa |            1 |         1 |              1

Что я хочу получить в качестве результата

 user_id | country |  city  |      institute       | country_rank | city_rank | institute_rank
---------+---------+--------+----------------------+--------------+-----------+----------------
      18 | Canada  | Ottawa | University of Ottawa |            2 |         1 |              2

1 Ответ

1 голос
/ 15 марта 2020

Помещение предложения where непосредственно в запрос удаляет строки из набора данных, прежде чем функции ранжирования получат возможность выполнения. Осталась только одна строка, поэтому она занимает первое место в каждом разделе.

Вам потребуется ранжировать в подзапросе, а затем выполнить фильтрацию во внешнем запросе:

SELECT *
FROM (
    SELECT 
        user_id,
        country,
        city,
        institute,  
        RANK() OVER (PARTITION BY country ORDER BY up_vote+down_vote DESC) country_rank,
        RANK() OVER (PARTITION BY city ORDER BY up_vote+down_vote DESC) city_rank,
        RANK() OVER (PARTITION BY institute ORDER BY up_vote+down_vote DESC) institute_rank
    FROM Users
) t
WHERE user_id = 18
...