接上一篇的内容,继续讲一下窗口函数和分析函数结合的使用。
lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。
https://my.oschina.net/u/2338224/blog/3112042
lag(expression, offset, default_value)
取出同一字段的前N行的数据。
语法
lag(expression, offset, default_value)
- expression: 表达式,需要处理的结果列。
- offset: 偏移量,必须>=0,=0时返回当前行自己。>0返回当前行的前几行
- default_value: 默认值,第一行没有值时显示。
示例
select
name, dept,
salary,
lag(salary, 1) over (partition by dept order by salary ) as '上一个人的工资'
from t_window_func
lag(salary, 1) over (partition by dept order by salary )
通过对部门分区,对薪资取上一条数据,最后根据薪资正序排序,展示了不同部门每个人自己和上一个人的薪资情况。
从结果集中,我们看到了的是,
- 首先数据根据
partition by dept
, 根据部门进行了分区,不同分区不同处理。 - defaultValue展示了默认值
- 员工2的上一个人工资=员工1的10000,员工3的上一个人工资=员工2的10000,以此类推
lead(expression, offset, default_value)
取出同一字段的后N行的数据,语法与lag的相同。
示例
select
name, dept,
salary,
lead(salary, 1, 'defaultValue') over (partition by dept order by salary ) as '下一个人的工资'
from t_window_func