需要帮助排名列

时间:2020-03-19 19:54:39

标签: sql postgresql

根据他们的国家,城市和机构,我试图获得最多的选票。 但是,我的输出错误。

我的代码:

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

TABLE users_vote

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

我正在使用PostgreSQL谢谢!

1 个答案:

答案 0 :(得分:1)

三点:

  1. 如果您想最后对null进行排名,则应在ORDER BY子句中这样说。
  2. 我想你想从投票中减去 投票?
  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;

(某些DBMS也要求u.country, u.city, u.institute包含在GROUP BY子句中,但这不是SQL标准所必需的,因为这些列在功能上依赖于u.user_id,我想这是表的键。我非常确定PostgreSQL在这方面符合标准。)