前言
本文主要记录SQL-跨行计算/lag()/lead()相邻两行某列数据四则计算的相关笔记,这两个函数可以获取当前行的后一行数据或者前一行数据,可以用于计算每日或者每此记录的增量计算,或者计算相邻两行某列差值。文章也使用sum()函数,rows n preceding语法进行累加运算。
1. lag()
lag()指获取当前行当前列第前n行当前列数据,完整函数参数如下:
lag(list_name,offset,default_value)
·list_name:列名
·offset:偏移的offset,获取当前行当前列的第前offset行当前列数据。
·default_value:如果偏移位置没有数据,则取default_value。
现有一张表table1,里面由三列数据(“id”,“name”,“num”),具体内容如下:
下面我们根据name分组,以num从小到大进行排序,然后使用lag()获取前一行数据命名为列lo。
代码如下:
select name,num,lag(num,1,0)over(partition by name order by num)lo from table1
执行结果如下:
2. lead()
lag()指获取当前行当前列第后n行当前列数据,完整函数参数如下:
lead(list_name,offset,default_value)
参数解释同lag(),同样使用table1表来进行举例。
下面根据name分组,以num从小到大进行排序,然后使用lead()获取后一行数据命名为列lo。
代码如下:
select name,num,lead(num,1,0)over(partition by name order by num)lo from table1
执行结果如下:
3. 列累加运算sum()
获取num列从第1行到当前行的累加和数据,以name进行分组,完整函数参数如下:
sum(num)over(partition by name order by num)
查询结果
4. rows number preceding
对截至至当前日期共7天的数据进行列(“column1”)累加计算,此时number取值为6,完整函数参数如下:
select date1,sum(column1)over(order by date1 rows 6 preceding) from table1