SQL的窗口函数(偏移函数)LEAD()和LAG()附leetcode194题目讲解
一个挺有意思的函数分享给大家,所谓偏移,就是位置的改变.
函数的用法:lead(要操作的列,偏移行数,超出部分返回值):将数据进行位移,从下往上推,下端出现空格。
lag(要操作的列,偏移行数,超出部分返回值):将数据进行位移,从上往下推,上端出现空格。
,例如有几组数据如下:

然后对place列进行一个从下往上推的一个操作,生成一个新的列new_place
select id,place ,lead(place) over (order by id) as new_place from test
lead(place)不填的参数默认为1,null,也就是现在只偏移1行,超出部分填了null。
order by id是指按照id列排序。

同理,lag()就是上往下偏移。
select id,place ,lag(place) over (order by id) as new_place from test

主要是用于趋势的预测。下面带来一道LeetCode sql第197题来帮助大家加深理解:

测试用例及预期结果:
分析题目,求得是温度差值和日期差值,所以就用偏移函数来解决。
select Id from(
select id,recordDate, temperature,
LAG(temperature ) over (order by recordDate) as cp_T ,
LAG(recordDate) OVER (ORDER BY recordDate) AS cp_D
from Weather
)as a where temperature >cp_T and DATEDIFF(recordDate,cp_D) = 1;
LAG(temperature ) over (order by recordDate) as cp_T ,
LAG(recordDate) OVER (ORDER BY recordDate) AS cp_D这两行代码就表示生成新的两列字段,用于后续的一个比较,括号里面的一个查询结果如下(
select id,recordDate, temperature,
LAG(temperature ) over (order by recordDate) as cp_T ,
LAG(recordDate) OVER (ORDER BY recordDate) AS cp_D
from Weather
)就会得到一个这样的查询结果

然后在这个基础上再去进行一个查询,where temperature >cp_T and DATEDIFF(recordDate,cp_D) = 1;注意这里引入一个新的函数datediff(a,b),是用于计算两个日期之间差异的函数,结果就是a-b的值。此处为什么要=1呢?一定要注意审题:与(昨天的),隔两天就不算了,比如这个测试用例:

所以你学会了吗?共勉!
更多推荐
所有评论(0)