根据他们的国家,城市和机构,我试图获得最多的选票。 但是,我的输出错误。
我的代码:
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谢谢!
答案 0 :(得分:1)
三点:
ORDER BY
子句中这样说。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在这方面符合标准。)