子查询嵌套

获得积分最多的人(三)

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的用户。

全部评论

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务