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

获得积分最多的人(二)

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

方法一:

  1. 查询每个用户获得的总积分
    select user_id, sum(grade_num) as gn 
    from grade_info group by user_id 
  2. 使用窗口函数 dense_rank() 按照总积分成绩降序paim
    select 
    user_id, gn,
    dense_rank() over(order by gn desc) as rn
    from (
     select user_id,
         sum(grade_num) as gn
     from grade_info
     group by user_id
     ) a
    ) b
  3. 排名第一的就是积分最高的人,最终代码如下:
    select user_id, name, gn
    from (
     select user_id, gn,
         dense_rank() over(order by gn desc) as rn
     from (
         select user_id,
             sum(grade_num) as gn
         from grade_info
         group by user_id   
     ) a
    ) b 
    left join user u
    on b.user_id = u.id
    where rn = 1
    ;
    方法二:聚合函数和窗口函数结合
    下面这这种方法更简洁。
    select user_id, name, gn
    from (
     select user_id, 
         sum(grade_num) as gn,
         dense_rank() over(order by sum(grade_num) desc) as rn
     from grade_info
     group by user_id
    ) a 
    left join user u
    on a.user_id = u.id
    where rn = 1
    ;
全部评论

相关推荐

11-04 19:05
已编辑
东莞城市学院 单片机
不知道怎么取名字_:你这个要实习两年?哪有这么久的,感觉就是即使你毕业了,但还按实习的话,是不是不用给你缴社保公积金啥的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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