如何在 Postgresql 中对总和进行排名?

Posted

技术标签:

【中文标题】如何在 Postgresql 中对总和进行排名?【英文标题】:How to rank on aggregated sum in Postgresql? 【发布时间】:2020-08-17 17:59:14 【问题描述】:

我想按总分排名。示例:猜谜游戏。第一天:甲猜得10分,乙猜得9分。第 2 天:A 得 5 分,B 得 9。

我想要得到的是: 第 2 天,A 的总积分为 15 分,排名第 2。

这是基本表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;

我觉得我应该使用子查询,但后来我想知道如何对其进行分区。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您可以使用子查询:

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;

【讨论】:

谢谢,我了解到我可以在主查询中使用子查询输出我需要的列,完美!

以上是关于如何在 Postgresql 中对总和进行排名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlite中对表中的行进行排名?

如何在 MySql 中对分区进行排名

如何在 PostgreSQL 中对列的一部分进行分组?

如何在 SQL Server 中按日期列排序的组中对列进行排名

Django:如何在 Postgresql 中对日语(多字节字符串)进行全文搜索

如何通过 valueForKey 从 fetch 中对数组进行排序