Нужна помощь в ранжировании столбцов - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь набрать наибольшее количество голосов в зависимости от страны, города и института. Тем не менее, я получаю неправильный вывод.

Мой код:

SELECT u.user_id, u.country, u.city, u.institute, uv.up_vote, uv.down_vote,
        RANK() OVER (PARTITION BY country ORDER BY SUM(uv.up_vote) + SUM(uv.down_vote) DESC) country_rank,
        RANK() OVER (PARTITION BY city ORDER BY SUM(uv.up_vote) + SUM(uv.down_vote) DESC) city_rank,
        RANK() OVER (PARTITION BY institute ORDER BY SUM(uv.up_vote) + SUM(uv.down_vote) DESC) institute_rank
    FROM Users u LEFT JOIN users_vote uv ON u.user_id=uv.receiver_id
    GROUP BY u.user_id, u.country, u.city, u.institute, uv.up_vote, uv.down_vote;

Мой вывод:

user_id | country |     city      |        institute         | up_vote | down_vote | country_rank | city_rank | institute_rank
---------+---------+---------------+--------------------------+---------+-----------+--------------+-----------+----------------
      18 | Canada  | Ottawa        | University of Ottawa     |         |           |            1 |         1 |              1
      20 | Canada  | Ottawa        | University of Ottawa     |         |           |            1 |         1 |              1
      17 | Canada  | Toronto       | University of Ottawa     |      10 |         0 |            3 |         1 |              3
      26 | USA     | Santa Clara   | UCSD                     |         |           |            1 |         1 |              1
      25 | USA     | Seattle       | University of Washington |         |           |            1 |         1 |              1
      27 | USA     | Los Angeles   | UCLA                     |         |           |            1 |         1 |              1
      22 | USA     | New York      | NYU                      |         |           |            1 |         1 |              1
      21 | USA     | San Francisco | CalTech                  |         |           |            1 |         1 |              1
      23 | USA     | Texas         | University of Texas      |      10 |         0 |            6 |         1 |              1
      16 | test123 | test123       | test123                  |         |           |            1 |         1 |              1

То, что я хочу, чтобы мой вывод был

user_id | country |     city      |        institute         | up_vote | down_vote | country_rank | city_rank | institute_rank
---------+---------+---------------+--------------------------+---------+-----------+--------------+-----------+----------------
      18 | Canada  | Ottawa        | University of Ottawa     |         |           |            2 |         1 |              2
      20 | Canada  | Ottawa        | University of Ottawa     |         |           |            2 |         1 |              2
      17 | Canada  | Toronto       | University of Ottawa     |      10 |         0 |            1 |         1 |              1
      26 | USA     | Santa Clara   | UCSD                     |         |           |            2 |         1 |              1
      25 | USA     | Seattle       | University of Washington |         |           |            2 |         1 |              1
      27 | USA     | Los Angeles   | UCLA                     |         |           |            2 |         1 |              1
      22 | USA     | New York      | NYU                      |         |           |            2 |         1 |              1
      21 | USA     | San Francisco | CalTech                  |         |           |            2 |         1 |              1
      23 | USA     | Texas         | University of Texas      |      10 |         0 |            1 |         1 |              1
      16 | test123 | test123       | test123                  |         |           |            2 |         1 |              1

ТАБЛИЦА users_vote

 receiver_id | up_vote | down_vote
-------------+---------+-----------
          23 |      10 |         0
          17 |      10 |         0
          17 |      10 |         0

Я использую postgresql Спасибо!

1 Ответ

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

Три балла:

  1. Если вы хотите ранжировать нули в последнюю очередь, вы должны сказать об этом в пунктах ORDER BY.
  2. И я полагаю, вы хотите вычесть downvotes от upvotes?
  3. Наконец, я предполагаю, что вы хотите одну строку для user_id, так что это должна быть клавиша GROUP BY.

Запрос:

SELECT u.user_id, u.country, u.city, u.institute, uv.up_vote, uv.down_vote,
  RANK() OVER (PARTITION BY country
               ORDER BY SUM(uv.up_vote) - SUM(uv.down_vote) DESC NULLS LAST
              ) AS country_rank,
  RANK() OVER (PARTITION BY city
               ORDER BY SUM(uv.up_vote) - SUM(uv.down_vote) DESC NULLS LAST
              ) AS city_rank,
  RANK() OVER (PARTITION BY institute
               ORDER BY SUM(uv.up_vote) - SUM(uv.down_vote) DESC NULLS LAST
              ) AS institute_rank
FROM Users u
LEFT JOIN users_vote uv ON u.user_id = uv.receiver_id
GROUP BY u.user_id
ORDER BY u.user_id;

(Некоторые СУБД требуют, чтобы u.country, u.city, u.institute также присутствовал в предложении GROUP BY, но это не требуется стандартом SQL, поскольку эти столбцы функционально зависят от u.user_id, что Я предполагаю, что ключ к столу. Я почти уверен, что PostgreSQL соответствует стандарту в этом отношении.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...