SQL查询中如何以两列为分组键获取分组最大值并对结果累加求和
按用户分组统计年度最高积分总和的SQL实现需求
我正在尝试编写SQL查询,以两列作为分组键,先取出每组的最大值,再对每个分组的最大值求和,后续可自动适配下一组分组键。
示例表结构
现有一张包含年份、用户ID、周次、积分字段的表,每一年对应用户多个周的积分数据,具体内容如下:
| year | userid | week | points |
|---|---|---|---|
| 2020 | 1 | 1 | 3 |
| 2020 | 1 | 3 | 3 |
| 2020 | 1 | 3 | 5 |
| 2020 | 1 | 4 | 12 |
| 2020 | 2 | 1 | 4 |
| 2020 | 2 | 2 | 4 |
| 2020 | 2 | 3 | 6 |
| 2020 | 2 | 4 | 10 |
| 2021 | 1 | 1 | 4 |
| 2021 | 1 | 2 | 5 |
| 2021 | 1 | 3 | 8 |
| 2021 | 1 | 4 | 9 |
| 2021 | 2 | 1 | 3 |
| 2021 | 2 | 2 | 6 |
| 2021 | 2 | 3 | 7 |
| 2021 | 2 | 4 | 13 |
具体需求
先取出每个用户每一年的最高积分,再把每个用户的所有年度最高积分相加求和,最终按总积分倒序排序。
预期输出
各用户年度最高积分明细
用户1: 2020, 1, 12 2021, 1, 9 用户2: 2020, 2, 10 2021, 2, 13
求和排序后的最终结果
| userid | points |
|---|---|
| 2 | 33 |
| 1 | 21 |
查询逻辑需兼容后续新增用户、新增年份的场景,无需修改代码即可适配。
最终实现方案
经过验证可行的查询语句如下:
SELECT username, userdb.userid, SUM(points) as points FROM ( SELECT standing.*, row_number() over (partition by standing.userid, year ORDER BY points desc) AS seqnum FROM standing ) t JOIN userdb on userdb.userid = t.userid WHERE seqnum = 1 GROUP BY userid ORDER BY points DESC
内容的提问来源于stack exchange,提问作者Montero Ro
相关产品推荐
相关产品推荐

