前言:
窗口函数的名字是over()函数,常用的有两个属性partition by和order by,partition by类似于group by,我们通常将group by叫做分组,而partition by称作分区,分组返回通常是一行,partition by返回的是多行。
窗口函数的威力是与其他函数联合使用,窗口函数主要和统计函数,排名函数,错行的函数联合使用.
1、row_number() over() 函数
为每条记录返回一个数字。
select sno,sname,ssex,row_number() over(order by sno desc ) 排名 from student;
select sno,sname,ssex,row_number() over(order by sno desc ) 排名 from student where sno = ‘109’;
2、row_number() over (partition by order by ) 结合使用
select sno,sname,ssex,sclass,row_number() over(partition by sclass order by sno desc ) rank from student;
3、 RANK()
rank 返回数据项在分组中的排名,排名相等会在名次中留下空位:
LAG:
lag ,lead 分别是向前,向后;
lag 和lead 有三个参数,第一个参数是列名,第二个参数是偏移的offset,第三个参数是 超出记录窗口时的默认值
LAG(column_name1,1) OVER(ORDER BY column_name2)
LEAG(column_name1,1) OVER(ORDER BY column_name2)
备注:超出记录窗口时的默认值其实就是自己定义数字,填充。
select sno,sname,ssex,lag(sclass,1,222)over(order by sclass desc) from student
没加记录超出默认值时的参数:如下
以上sclass括号内的1 加不加都是可以执行通的。
select sno,
sname,
ssex,
lead (sclass, 1) over(order by sclass desc) 对应班级号
from student order by sno desc;
总结:
注意:row_number含数前面的字段后是要加逗号的不然报错;因为本人老是忘记。
partition by:分组后的记录集合称为窗口。此处的窗口并非“窗户”的意思,而是代表范围。这也是窗口函数的由来。
通过PARTITION BY分组后的记录集合称为“窗口”。
● RANK函数
计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、4 位……
● DENSE_RANK函数
同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
例)有 3 条记录排在第 1 位时:1 位、1 位、1 位、2 位……
● ROW_NUMBER函数
赋予唯一的连续位次。
例)有 3 条记录排在第 1 位时:1 位、2 位、3 位、4 位……
暂时就这么多,如果还有,我会在添加进来的。
【转载注明出处,尊重原创 】