问题描述
我想按汇总分数排名。示例:一个猜谜游戏。第一天:A人猜出10分,B人猜出9分。第2天:人员A得5分,人员B得9分。
我想要得到的是: 在第2天,人员A的总积分为15分,排名为2。
这是基本表guesses
:
id,person,points,day
1,thomas,10,1
2,5,2
3,marie,9,1
4,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
*,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;