当前位置: 首页 > 科技观察

SQLServer的这两个高级功能你学会了吗?

时间:2023-03-14 14:55:41 科技观察

SQLServer从2012版本开始引入了LEAD和LAG函数。这两个函数可以改变以往关联查询的方式,直接获取与当前数据相邻的数据行数,可以方便的对相邻两行数据进行加减乘除。今天我们就来给大家介绍一下这两个函数的用法。LAG函数的作用LAGLAG提供对当前行之前具有给定物理偏移量的行的访问。在SELECT语句中使用此分析函数将当前行中的值与上一行中的值进行比较。LAG语法LAG(scalar_expression[,offset][,default])OVER([partition_by_clause]order_by_clause)参数说明值scalar_expression是按照指定的偏移量返回。这是返回单个(标量)值的任何类型的表达式。scalar_expression不能是解析函数。offset当前行之后的行数(从中获取值)。如果不指定,默认为1。OVER是一个窗函数,LAG函数必须和窗函数一起使用。LAG示例WITHTAS(SELECT1ID,10NUMUNIONALLSELECT1,20UNIONALLSELECT1,30UNIONALLSELECT2,40UNIONALLSELECT2,50UNIONALLSELECT2,60)SELECTID,NUM,LAG(NUM)OVER(PARTITIONBYIDORDERBYNUM)ASOneArgs,LAG(NUM,1)OVER(PARTITIONBYIDORDERBYNUM)ASTowArgs,2,LAG0)OVER(PARTITIONBYIDORDERBYNUM)ASThressArgsFROMT(提示:可以左右移动代码)结果如下:从上面的例子我们可以看出1.对于列OneArgs,组中NUM列的值默认后移一行,每组2的第一行替换为默认的NULL。对于TowArgs,使用了2个参数显示的偏移线,NUM的值也向后偏移了一行。3.对于ThreeArgs,不仅使用了2行的显示偏移量,而且第三个参数将偏移量后的默认值NULL改为0。实例:如何求解组中上下行的和?SELECTID,NUM,NUM+LAG(NUM,1,0)OVER(PARTITIONBYIDORDERBYNUM)ASResultFROMT结果如下:注意:因为默认第一行是0,所以每组第一行的结果是NUM+0=NUMLEAD函数LEAD函数和LAG函数正好相反。向前移动指定的行数,默认为1行。hash参数的语法和LAG类似,这里不再赘述。直接看例子:SELECTID,NUM,LEAD(NUM)OVER(PARTITIONBYIDORDERBYNUM)ASOneArgs,LEAD(NUM,1)OVER(PARTITIONBYIDORDERBYNUM)ASTowArgs,LEAD(NUM,2,0)OVER(PARTITIONBYIDORDERBYNUM)ASThressArgsFROMT结果:用法和LAG功能类似,只是将组中的数据向前移动指定的行数。实例:找出同一组中上下行的差异?SELECTID,NUM,LEAD(NUM,1,0)OVER(PARTITIONBYIDORDERBYNUM)-NUMASResultFROMT结果:每组最后一行默认为0,所以上面的0-NUM=-NUM就是这两个函数的相关用法。