如何在 Postgresql 中对总和进行排名?
How to rank on aggregated sum in Postgresql?
我想按总分排名。示例:猜谜游戏。第一天:A 猜对得 10 分,B 猜对得 9 分。第 2 天:A 获得 5 分,B 获得 9 分。
我想得到的是:
第2天,A总积分15分,排名第2
这是基本的 table guesses
:
id, person, points, day
1, thomas, 10, 1
2,thomas,5,2
3,marie,9,1
4,marie,9,2
我在获取按天分组的聚合点时没有问题:
SELECT
*,
sum(points) OVER (PARTITION BY person ORDER BY id) AS total_running_points,
FROM
guesses
ORDER BY
day asc;
但现在我每天都需要排名。
我尝试了以下但失败了,当然 total_running_points
是一个新别名:
SELECT
*,
sum(points) OVER (PARTITION BY person ORDER BY id) AS total_running_points,
rank() OVER (ORDER BY total_running_points desc)
FROM
bets_by_day
ORDER BY
day asc;
我觉得我应该使用子查询,但后来我想知道如何对其进行分区。
我该如何解决这个问题?
您可以使用子查询:
SELECT b.*, rank() over (order by total_running_points desc) rnk
FROM (
SELECT b.*, sum(points) over (partition by person order by id) AS total_running_points
FROM bets_by_day b
) b
ORDER BY day asc;
我想按总分排名。示例:猜谜游戏。第一天:A 猜对得 10 分,B 猜对得 9 分。第 2 天:A 获得 5 分,B 获得 9 分。
我想得到的是: 第2天,A总积分15分,排名第2
这是基本的 table guesses
:
id, person, points, day
1, thomas, 10, 1
2,thomas,5,2
3,marie,9,1
4,marie,9,2
我在获取按天分组的聚合点时没有问题:
SELECT
*,
sum(points) OVER (PARTITION BY person ORDER BY id) AS total_running_points,
FROM
guesses
ORDER BY
day asc;
但现在我每天都需要排名。
我尝试了以下但失败了,当然 total_running_points
是一个新别名:
SELECT
*,
sum(points) OVER (PARTITION BY person ORDER BY id) AS total_running_points,
rank() OVER (ORDER BY total_running_points desc)
FROM
bets_by_day
ORDER BY
day asc;
我觉得我应该使用子查询,但后来我想知道如何对其进行分区。
我该如何解决这个问题?
您可以使用子查询:
SELECT b.*, rank() over (order by total_running_points desc) rnk
FROM (
SELECT b.*, sum(points) over (partition by person order by id) AS total_running_points
FROM bets_by_day b
) b
ORDER BY day asc;