子查询嵌套

获得积分最多的人(三)

https://www.nowcoder.com/practice/d2b7e2a305a7499fb310dc82a43820e8

SELECT
    u.id,
    u.name,
    grade_num
FROM(
    SELECT
        user_id,
        SUM(t1.real_grade) AS grade_num,
        DENSE_RANK() OVER(ORDER BY SUM(t1.real_grade) DESC) AS rk
    FROM(
        SELECT *,
            CASE
                WHEN type = 'add' THEN grade_num
                WHEN type = 'reduce' THEN (-1) * grade_num
            END AS real_grade
        FROM grade_info
    ) t1
    GROUP BY user_id
) t2
JOIN user u
    ON u.id = t2.user_id
WHERE rk = 1
ORDER BY id

一共有三层查询,在最里层的子查询中,使用CASE WHEN语句区分出加的分数和减的分数(real_grade)。在中间一层的查询中,利用上一层的real_grade使用SUM计算总的得分,并且使用窗口函数得到总得分的排序rk。在最外层查询中,利用rk筛选出总得分排名为1的用户。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:23
转人工😡
门口唉提是地铁杀:五次握手了
点赞 评论 收藏
分享
头顶尖尖的程序员:我是26届的不太懂,25届不应该是找的正式工作吗?为什么还在找实习?大四还实习的话是为了能转正的的岗位吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务