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

获得积分最多的人(三)

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

# 求总积分,根据表可知,有增加,有减少,需要将增加总额和减少总额放到同一行,做减法后可得总积分
# 1、积分表 join 用户表,join 结果 id 和 name 分组,利用 case when 求增加总额和减少总额,放到同一行,并相减得出总积分,并利用窗口函数排序总积分,注意,这里已经是分组后的结果,所以 dense_rank 无需再 partition by,直接 order by 即可;
# 2、上一步结果作为子查询,设定好,排名第一,且 id 升序排列,select 出结果



select user_id as id
      ,name
	  ,grade_num
from (
select g.user_id
      ,u.name
      ,sum(case when type='add' then grade_num else 0 end) as add_num
      ,sum(case when type='reduce' then grade_num else 0 end) as reduce_num
      ,sum(case when type='add' then grade_num else 0 end)-sum(case when type='reduce' then grade_num else 0 end) as grade_num
      ,dense_rank() over(order by sum(case when type='add' then grade_num else 0 end)-sum(case when type='reduce' then grade_num else 0 end) desc) as rk
from grade_info as g
left join user as u
on g.user_id=u.id
group by g.user_id
        ,u.name
) as a
where rk=1
order by id

全部评论

相关推荐

程序员小白条:找实习多投就行,但25届现在是春招时间呃呃呃,你想以后参加社招吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务