题解 | 获得积分最多的人(三)

SELECT b3.id AS user_id, b3.name, b3.grade_num
FROM (
    SELECT b1.id, b1.name, 
    (b1.totalgrade_add-b2.totalgrade_reduce) AS grade_num,
    DENSE_RANK() OVER (ORDER BY (b1.totalgrade_add-b2.totalgrade_reduce) DESC) AS ranking
    FROM (
        # b1: 筛选需要add的分数
        SELECT U.id, U.name, SUM(G.grade_num) AS totalgrade_add
        FROM grade_info G
        JOIN user U ON G.user_id=U.id
        WHERE G.type='add'
        GROUP BY U.id,U.name) AS b1
    JOIN (
        # b2: 筛选需要reduce的分数
        SELECT B.id, B.name, SUM(B.grade_reduce) AS totalgrade_reduce
        FROM (
            SELECT U.id, U.name, 
            CASE WHEN G.type='reduce' THEN G.grade_num
            ELSE 0 END AS grade_reduce
            FROM grade_info G
            JOIN user U ON G.user_id=U.id) AS B
        GROUP BY B.id, B.name
        ) AS b2
    ON b1.name=b2.name
    ) AS b3
WHERE b3.ranking=1
ORDER BY b3.id

全部评论

相关推荐

uu们,拒offer时hr很生气怎么办我哭死
爱睡觉的冰箱哥:人家回收你的offer,或者oc后没给你发offer的时候可不会愧疚你,所以你拒了也没必要愧疚他。
点赞 评论 收藏
分享
06-10 23:36
已编辑
首都经济贸易大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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