SQL查询获取同一字段前/后n行的值_lag/lead
Posted 坏脾气
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询获取同一字段前/后n行的值_lag/lead相关的知识,希望对你有一定的参考价值。
lag/lead
1. 简介:
lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数可以在一次查询中取出同一字段的前N行的数据(lag)和后N行的数据(lead)作为独立的列,从而更方便地进行进行数据过滤。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。
2. 语法
LAG(EXP_STR,OFFSET,DEFVAL) OVER()
LEAD(EXP_STR,OFFSET,DEFVAL) OVER()
3. 说明
【EXP_STR】:待查询的参数列名
【
OFFSET
】:取偏移后的第几行数据
【
DEFVAL
】:没有符合条件时的默认值
4. 示例
- 初始化数据:
create table student ( no varchar(20) not null primary key, name varchar(30), class varchar(2)); insert into student values(\'06117050\', \'张三\', \'01\'); insert into student values(\'06117051\', \'李四\', \'01\'); insert into student values(\'06117052\', \'王五\', \'01\'); insert into student values(\'06117053\', \'刘夕月\', \'01\'); insert into student values(\'06117054\', \'朱龙\', \'01\'); insert into student values(\'06117055\', \'小微\', \'01\'); insert into student values(\'06117056\', \'小红\', \'01\'); insert into student values(\'06117057\', \'张艳\', \'01\'); insert into student values(\'06127001\', \'钱多多\', \'02\'); insert into student values(\'06127002\', \'张杰\', \'02\'); insert into student values(\'06127003\', \'王玲\', \'02\'); insert into student values(\'06127004\', \'华少\', \'02\'); commit;
- 获取同一班级中,下一位同学的学号:
select s.no "学号", lead(s.no, 1) over(partition by s.class order by s.no) "下一个同学的学号", s.name "姓名", s.class "班级" from student s
结果
- 获取同一班级中,上一位同学的学号:
--获取下一个学号 select s.no "学号", lag(s.no, 1) over(partition by s.class order by s.no) "上一个同学的学号", s.name "姓名", s.class "班级" from student s
结果:
以上是关于SQL查询获取同一字段前/后n行的值_lag/lead的主要内容,如果未能解决你的问题,请参考以下文章