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

获得积分最多的人(三)

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

# 题目:查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序
# 明确问题:查找积分最高用户的ID,然后对应到名字,以及总积分
# 由于现在的grade_info类型多了减分的,所有总积分是用ADD的合计减去REDUCE的合计
# 那么我们先看每个用户add多少分,reduce多少分,然后相减得出实际总积分,注意使用left join
# 然后相减的时候记得把匹配不到的作为0,这样才是最终的总积分
  • select   a.user_id,a.grade_num1-ifnull(b.grade_num2,0) as final_grade
  • from 
  •    (
  •  select user_id,sum(    grade_num)     grade_num1
  •  from  grade_info
  •  where type='add'
  • group by user_id 
  •   )a
  •  left join
  •   ( 
  •  select user_id,sum(    grade_num)     grade_num2
  •  from  grade_info
  •  where type='reduce'
  •   group by user_id 
  •  ) b
  •  on a.user_id=b.user_id;
# 然后把这个作为一个子查询,使用RANK()OVER对其总积分进行排序,不需要分区,然后选择rank=1的ID
# 连接USER表即可,我这个办法是有笨但是我相对来说好理解,应该有更好的解决办法
  • select z.id,z.name,x.final_grade as grade_num
  • from 
  • (
  • SELECT user_id,final_grade,rank()over(order by final_grade desc) t_rank
  • FROM 
  • (
  • select   a.user_id,a.grade_num1-ifnull(b.grade_num2,0) as final_grade
  • from 
  •   (
  • select user_id,sum(    grade_num)     grade_num1
  • from  grade_info
  • where type='add'
  • group by user_id 
  •   )a
  • left join
  •  ( 
  • select user_id,sum(    grade_num)     grade_num2
  • from  grade_info
  • where type='reduce'
  •  group by user_id 
  • ) b
  • on a.user_id=b.user_id
  • ) f
  • )x
  • join  user   z
  • on x.user_id=z.id
  • where x.t_rank=1
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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