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

获得积分最多的人(三)

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

这个题难点在于这个积分又增又减少

我第一次做想把为每个id 的add 增加多少分 每个id 的reducer 减少多少分

然后去依据id去整合 这个最后的分数 但是发现问题 假如用 add的表 left join reducer

会发现假如一个id只有add没有reducer 你去算add-redeucer 这个列他妈的就显示None 不好玩
创建一个临时表 查出 id name 整合后的积分 排名
with temp AS(
SELECT id,NAME, g_sum, DENSE_RANK() over (order by g_sum desc ) r_s from
#里面查找 id name 积分的sum里面运用到case when 来判别是增加还是减少
(
select u.id ,u.name,
sum(case when g.type='add' then g.grade_num else -g.grade_num end) g_sum
from user u
left join grade_info g
ON u.id=g.user_id
GROUP BY 1,2
)f
)
#选取出排名列等于1的行
select id,name,g_sum from temp
where r_s=1;

网友牛逼写法

select t1.id,t1.name,t0.grade as grade_sum
from(
这里面就是窗口函数做一下排名 后面好筛选出 t=1的
select user_id,grade,rank()over(order by grade desc) as t
from(
!他这里不是用case when处理 使用if 判断的 求出 id 整合后的积分
select user_id,sum(if(type='add',grade_num,-1*grade_num)) as grade
from grade_info
group by user_id
) a0
) t0
join user as t1
on t0.user_id = t1.id
where t=1

菜且快乐的一天

全部评论

相关推荐

半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-21 17:59
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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