总体思路:
1.根据user_id,分组求其总grade_num
2.对grade_num排名,并取排名为1的记录信息
3.join on 'user'表,得到完整信息
代码:
select u.id, u.name, t1.grade from (select t.user_id, t.grade, dense_rank()over(order by t.grade desc) as r_number from (select user_id, sum(case type when 'add' then grade_num else grade_num*(-1) end) as grade #可改写为sum(case type when 'add' then grade_num else grade_num*(-1) end)over(partition by user_id) 则,该句后面“group by user_id”可省略。 from grade_info group by user_id ) t #该子循环主要是以user_id分组,求其grade_num和。其中用case when函数控制type中的正负,并嵌套sum()函数求和 ) t1 #该子循环主要是针对上一子循环求出的grade_num做排序,并取排序为1的记录信息。其中用到dense_rank()函数对t.grade值从大到小进行排序 join user u on t1.user_id = u.id where t1.r_number = 1 order by u.id asc