sql高级语法之窗口函数调用
- DENSE_RANK():为组内值生成连续排序号,其中,相同值具有相同序号
- LAG():为组内对应值生成滞后值
- LEAD():为组内对应值生成提前值
- RANK():为各组内值生成跳跃排序序号,其中,相同的值具有相同序号
- ROW_NUMBER():为各组内值生成连续排序序号,其中,相同的值其序号也不相同
创建表
create table T_num(
num int
);
insert into T_num values(1),(1),(2),(3),(3),(3),(4),(4),(5);
sql中的over函数和其它函数配合使用,可生成行号。
DENSE_RANK()
为组内值生成连续排序号,其中,相同值具有相同序号。
select num,DENSE_RANK() OVER(order by num) AS 'DENSE_RANK' from T_num;
右侧为对num的排序序号,DENSE_RANK()的排序规则为,如果数字相等则排序的序号相等,且相等序号不占一位,下一个数的排序序号从此序号加1开始。
RANK()
为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。
select num,RANK() OVER(order by num) AS 'RANK' from T_num;
RANK()函数的排序规则为,如果数字相等则排序的序号相等,且每一个相等序号隐含占一位,下一个数的排序序号从此序号加上所有的此序号的个数开始,如上图num=2的序号=1+2=3.,即它会“跳跃”。
ROW_NUMBER()
为各组内值生成连续排序序号,其中,相同的值其序号也不相同。
select num,ROW_NUMBER() OVER(order by num) AS 'RANK' from T_num;
ROW_NUMBER()的排序规则为,所有数字按连续序号排序,相同的num也需要排出1、2、3…
LAG()
为组内对应值生成滞后值。
select num,LAG(NUM) OVER(order by num) AS 'LAG' from T_num;
即将其选中的项滞后一位输出,第一位补为NULL,其余按需输出,最后一位不输出
LEAD()
LEAD()函数恰好与LAG()函数相反。为组内对应值生成提前值。
select num,LEAD(NUM) OVER(order by num) AS 'LEAD' from T_num;