在我的PieCloudDB数据库中,我有一个用户表和一个成绩表,其中成绩表记录了用户的成绩信息。 (示例数据)。
用户:
id | 名字 |
---|---|
1 | 巴克 |
2 | 怜悯 |
3 | 尼卡 |
4 | 卡米尔 |
5 | 雏菊 |
年级信息:
用户ID | 年级号 | 类型 |
---|---|---|
1 | 5 | 添加 |
2 | 4 | 添加 |
1 | 1 | 减少 |
3 | 2 | 添加 |
4 | 2 | 添加 |
5 | 3 | 添加 |
3 | 1 | 减少 |
4 | 2 | 添加 |
例如,第一行表示 user_id 1 的用户获得了 5,第三行表示该用户随后损失了 1。
我想使用 SQL 查询找到等级最高的用户的 id、姓名和总等级。可能有多个具有相同等级的用户。查询结果应按id升序排序。上面例子的结果如下:
id | 名字 | 总成绩 |
---|---|---|
1 | 巴克 | 4 |
2 | 怜悯 | 4 |
4 | 卡米尔 | 4 |
我尝试了以下方法,但我觉得我的方法太复杂了。有没有更简单的查询?
SELECT u.id, u.name, g.total_grade
FROM users u
JOIN (
SELECT user_id, SUM(
CASE WHEN type = 'add' THEN grade_num
WHEN type = 'reduce' THEN -grade_num
ELSE 0
END
) AS total_grade
FROM grade_info
GROUP BY user_id
) g ON u.id = g.user_id
WHERE g.total_grade = (
SELECT MAX(total_grade)
FROM (
SELECT user_id, SUM(
CASE WHEN type = 'add' THEN grade_num
WHEN type = 'reduce' THEN -grade_num
ELSE 0
END
) AS total_grade
FROM grade_info
GROUP BY user_id
) max_grades
)
ORDER BY u.id;
您可以在 PieCloudDB 数据库中使用 CTE(通用表表达式)语法进行查询。这可能对你有帮助:
with tg AS
(select
u.id, u.name, sum(case when gi.type='add' then gi.grade_num else -gi.grade_num end) total_grade
from users u , grade_info gi
where u.id = gi.user_id
group by 1,2
)
select * from tg
where total_grade = (select max(total_grade) from tg)
order by id;