gpt4 book ai didi

PostgreSQL 窗口函数 "column must appear in the GROUP BY clause"

转载 作者:行者123 更新时间:2023-11-29 12:29:49 25 4
gpt4 key购买 nike

我正在尝试从用户得分条目列表中获取用户得分总和的排行榜。单个用户可以在此表中拥有多个条目。

我有下表:

rewards
=======
user_id | amount

我想将给定用户的所有 amount 值相加,然后在全局排行榜上对他们进行排名。这是我要运行的查询:

SELECT user_id, SUM(amount) AS score, rank() OVER (PARTITION BY user_id) FROM rewards;

我收到以下错误:

ERROR:  column "rewards.user_id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT user_id, SUM(amount) AS score, rank() OVER (PARTITION...

user_id 是否已经在“聚合函数”中,因为我正在尝试对其进行分区? PostgreSQL 手册显示了以下条目,我认为它与我的直接平行,所以我不确定为什么我的不工作:

SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;

他们没有按 depname 分组,那么他们的方法怎么会起作用呢?

例如,对于以下数据:

user_id | score
===============
1 | 2
1 | 3
2 | 5
3 | 1

我希望得到以下输出(我在用户 1 和 2 之间做了一个“平局”):

user_id | SUM(score) | rank
===========================
1 | 5 | 1
2 | 5 | 1
3 | 1 | 3

所以用户 1 的总分是 5,排名第一,用户 2 的总分是 5,因此也是排名第一,用户 3 的总分是 1,排名第三。

最佳答案

您需要 GROUP BY user_id 因为它没有被聚合。然后你可以根据需要按SUM(score)降序排列;

SQL Fiddle Demo

SELECT user_id, SUM(score), RANK() OVER (ORDER BY SUM(score) DESC)
FROM rewards
GROUP BY user_id;

user_id | sum | rank
---------+-----+------
1 | 5 | 1
2 | 5 | 1
3 | 1 | 3

关于PostgreSQL 窗口函数 "column must appear in the GROUP BY clause",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35902583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com