今天讲讲数据库SQL server的相关知识,如果要将一个表里的两列进行运算,那么我们可以直接用字段进行运算,如A+B或A-B,其中A和B是两个不同列的字段名。
SQL Server 知识但是在项目中,有时候我们会遇到一些棘手的问题,做数据处理的时候,可能需要实现同一列的上下行运算。那么在此楼主提供两种思路:
一、SQL sever2012以上版本,可以用LAG函数。LAG的作用是,从当前行向下偏移指定的行数。 在 SELECT 语句中使用此分析函数可将当前行中的值与先前行中的值进行比较。使用语法如下:
LAG (scalar_expression [,offset] [,default]) OVER ( [ partition_by_clause ] order_by_clause )
其中,scalar_expression是指要根据指定偏移量返回的值。 这是一个返回单个(标量)值的任何类型的表达式,不能为分析函数。offset指当前行(从中获得取值)后的行数。 如果未指定,则默认值为 1。 OVER为开窗函数,LAG函数必须与开窗函数一起使用。为了说明更加具体一点,我们做个测试表,取名为T:
建立测试表然后执行SQL语句:SELECT ID,NUM,LAG(NUM) OVER (PARTITION BY ID ORDER BY NUM) AS OneArgs,LAG(NUM,1) OVER (PARTITION BY ID ORDER BY NUM) AS TowArgs,LAG(NUM,2,0) OVER (PARTITION BY ID ORDER BY NUM) AS ThressArgsFROM T,再看结果:
偏移后的数据显示从上面的示例中我们可以看出:
针对列OneArgs,组内的NUM列的值默认向下偏移了一行,每组的第一行用NULL来代替
针对TowArgs,offset参数传1,NUM的值也是向下偏移一行,结果和OneArgs一样。
针对ThreeArgs,offset参数传2,而且第三个参数将偏移后默认值NULL改成了0。
明白了LAG函数的原理,我们看看怎么实现上下行相加的运算:
SQL语句:SELECT ID,NUM,
NUM+LAG(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM) AS ResultFROM T
同列上下行相加运算注意:第一行因为默认是0,所以每组第一行的结果是NUM+0=NUM
与LAG函数相对应的,还有个函数叫LEAD,此函数与LAG函数刚刚相反,它是向上偏移指定的行数,默认是1行。使用语法同LAG函数类似,此处不再赘述,直接看结果:
LEAD函数执行结果向上偏移一行那么我们很容易解答一个问题:如何求解同组内上下两行的差?语句如下:
SELECT ID,NUM,LEAD(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM)-NUM AS ResultFROM T
同列上下行相减运算运算规则可以自己写,主要是要弄明白你想让数据向上偏移还是向下偏移。
二、SQL sever2012以下版本,尝试用临时表拆分数据之后再比对的方式。
以上面的表为例,首选需要做个临时表,这个表带有唯一标示号,我们取字段名为xh:
做出新的临时表再执行SQL语句:SELECT a.ID,a.NUM,b.NUM-a.NUM FROM TA a
left join (SELECT xh-1 as xh,ID,NUM from TA) b on a.xh =b.xh AND a.ID=b.ID
用临时表的方法算出结果总结:这两种虽然写法和语法都不一样,但是思路是一样的,就是先把一个列的数据向上或向下偏移,偏移后形成一个新的列,然后再进行两列的运算,得到我们想要的结果。
好了今天的SQL知识暂时就分享到这里,有疑问的读者可以评论区留言,欢迎关注我的百家号"IT圈不乱"。