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

我第一次做想把为每个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

菜且快乐的一天