题目描述
我们有两个表:
user
:包含用户信息,包括用户IDid
和用户名name
。grade_info
:包含积分信息,包括用户IDuser_id
、积分数量grade_num
和积分类型type
。
目标是查询出积分增加最高的用户的名字及其总积分。
知识点
- 窗口函数:使用
SUM
窗口函数计算每个用户的总积分。 - 连接操作:使用
JOIN
连接用户表和积分表。 - 排序和限制:使用
ORDER BY
和LIMIT
子句按积分降序排列并限制结果集。
关键问题分析
1. 计算每个用户的总积分
我们使用SUM
窗口函数计算每个用户的总积分:
sum(g.grade_num) over(partition by g.user_id) as grade_num
SUM(g.grade_num) OVER (PARTITION BY g.user_id) AS grade_num
: 计算每个用户的总积分。
2. 连接用户信息
我们使用JOIN
连接用户表和积分表,以获取用户名:
join user u on u.id = g.user_id
JOIN user u ON u.id = g.user_id
: 连接用户信息。
3. 排序和限制输出
我们按积分降序排列,并限制结果集为1条记录:
order by grade_num desc
limit 1
ORDER BY grade_num DESC
: 按积分降序排列。LIMIT 1
: 限制结果集为1条记录。
完整代码
select u.name, sum(g.grade_num) over(partition by g.user_id) as grade_num
from grade_info g
join user u on u.id = g.user_id
order by grade_num desc
limit 1;