【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

  结果:

    

原文地址:https://www.cnblogs.com/zhuhaiying/p/12228154.html

时间: 2024-10-12 11:40:21

【SQL查询】获取同一字段前/后n行的值_lag/lead的相关文章

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题

关于用Hibernate执行sql查询,字符字段类型只返回第一个字节的问题 今天遇到了一个问题,就是在Hibernate中,我用sql去查询mysql数据库里面的user表里面的username字段,但是发现查出来的数据都是只有第一个字,例如:在user表里面的username字段中有一条数据是:"Chen chiwei",查询后返回的结果却是这条数据的第一个字母:"C":于是乎,我查了一下user这张表的设计,发现username这个字段的类型是'char'类型,

[SQL]查询某一个字段在某一段时期数据库中使用到的记录

有些时候我们常常须要哪里用到了一些表,又或者什么时候运行了某一个存储过程.整理出了在某段时期内数据库运行的sql查询.也能够查询到数据库中某些字段的存放处.非常好非常强大.希望能帮到大家~ SELECT TOP 1000 --创建时间 QS.creation_time, --查询语句 SUBSTRING(ST.text,(QS.statement_start_offset/2)+1, ((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(s

js获取指定字符前/后的字符串简单实例

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> </head> <script type="text/javascript"> /* string 字符串; str 指定字符; split(),用于把一个字符串分割成字符串数组; split(str)[0],读取数组中索引为

SQL执行并返回执行前/后结果

1.插入数据,并返回插入的数据: INSERT INTO TestTB(Province,City) output inserted.Province, inserted.City VALUES('广东','深圳') 2.同理,删除数据也是一样的,只不过是使用deleted表罢了. delete from TestTB output deleted.* where id=1 3.两个结合一起:返回更新前和更新后的数据: UPDATE TestTB SET Province = '湖南',City

sql查询 数据库 表 字段 等

1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FROM SysObjects Where XType='U' ORDER BY Name ==表中字段 1.方法一 SELECT * FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='表名' 2.方法二 select a.name tablename,

sql 查询每科的前三名

废话不多说,直接上脚本 CREATE TABLE [dbo].[Students]( [ID] [int] IDENTITY(1,1) NOT NULL, [name] [nchar](20) NULL, [kemu] [nchar](20) NULL, [score] [int] NOT NULL, CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NOREC

根据sql查询获取sql查询结果集列的元数据

public List<DatasetColumn> queryDatasetColumns(String datasetId) { if(StringUtil.isEmpty(datasetId)) { return new ArrayList<DatasetColumn>(); } DatasetDefine dataSet = this.findById(DatasetDefine.class, datasetId); String sql = "select * 

SQL - 查询某一字段值相同而另一字段值最大的记录

1. SELECT a.* FROM app a WHERE a.app_version = (SELECT MAX(b.app_version) FROM app b WHERE b.app_name = a.app_name) ORDER BY a.app_name; 2. SELECT a.* FROM app a WHERE NOT EXISTS(SELECT 1 FROM app b WHERE b.app_name = a.app_name AND b.app_version > a

[SQL]查询表里的字段名

Select Name from syscolumns Where ID=OBJECT_ID('表名') select * from information_schema.tables WHERE TABLE_TYPE='BASE TABLE' OR TABLE_TYPE='VIEW' select * from information_schema.views select * from information_schema.columns