一个挺有意思的函数分享给大家,所谓偏移,就是位置的改变.

函数的用法: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呢?一定要注意审题:与(昨天的),隔两天就不算了,比如这个测试用例:

所以你学会了吗?共勉!

更多推荐