题目复盘——窗口函数
题源牛客网——记录一下自己的学习
部分窗口函数知识复盘
窗口函数大全补充[http://t.csdn.cn/xJGxx]
窗口函数只能用在SELECT后
1.专用窗口函数
rank、dense_rank、row_number
①rank、dense_rank
rank:并列的项名词相同,且按照个数跳过后面的名次。e:1、2、3、3、5
rank () over (partition by 分组字段名
order by 排序字段名
rows between 1 preceding and 1 following)
rows(行)、preceding(之前)、following(之后)指定几条记录为一个框架,可以用于计算移动平均值
dense_rank:并列的项名词相同,不跳过后面的名次。e:1、2、3、3、4
②row_number
生成唯一的连续排序:1、2、3、4、5
窗口函数无需参数,因此通常括号里都是空的。
2.能作为窗口函数的聚合函数
sum,avg,count,max,min
这里括号里就不是空的了,需要添加计算的字段。
sum(计算字段) over (order by 排序字段) as current_sum,
avg(计算字段) over (order by 排序字段) as current_avg,
count(计算字段) over (order by 排序字段) as current_count
sum——从上到下累加效果
avg——从上到下平均值
count——累计几个了
max——累计到此最大的数
min——累计到此最小的数
这篇总结的很好:http://t.csdn.cn/LKa7e
SQL27 每类试卷得分前3名
问题分析
(1)有新的ranking列——窗口函数——rank()over(partition by order by);
(2)每类试卷得分前三名——得分前三名的人,不是找top3分数;
(3)三个排序条件——max(score),min(score),uid ;
(4)每一类每个人的max和min——group by tag,uid;
答案重写
SELECT tid,uid,ranking FROM
(SELECT e_i.tag tid,e_r.uid uid,rank()over(partition by e_i.tag
order by max(score) desc,min(score) desc,e_r.uid desc</