C#高级:数据库中使用SQL作分组处理4(LAG() 偏移函数)

一、定义

1. 偏移函数定义

访问结果集中其他行的数据

2. LAG语法

获取 前N行 的值:LAG(列名, 偏移量=N=1, 默认值=NULL) OVER (PARTITION BY 分组字段 ORDER BY 排序字段)

3. LEAD语法

获取 后N行 的值:LEAD(列名, 偏移量=N=1, 默认值=NULL) OVER(PARTITION BY 分组字段 ORDER BY 排序字段)

提示:偏移量和默认值可以不传,本身就有默认

二、场景举例

假设存在

学生成绩表:ID StuID Score Time

我需要查询:ID StuID Score Time 上次的分数 上次的考试时间 下次的分数 下次的考试时间

(如果不存在上次或者下次成绩,返回-1即可)

三、SQL

sql 复制代码
SELECT 
    ID,
    StuID,
    Score,
    Time,
    ISNULL(LAG(Score)  OVER (PARTITION BY StuID ORDER BY Time), -1) AS 上次的分数,
    LAG(Time)        OVER (PARTITION BY StuID ORDER BY Time) AS 上次的考试时间,
    ISNULL(LEAD(Score) OVER (PARTITION BY StuID ORDER BY Time), -1) AS 下次的分数,
    LEAD(Time)       OVER (PARTITION BY StuID ORDER BY Time) AS 下次的考试时间
FROM 
    学生成绩表
ORDER BY 
    StuID, Time;
相关推荐
廿一夏7 小时前
MySql存储引擎与索引
数据库·sql·mysql
lzhdim9 小时前
SQL 入门 15:SQL 事务:从 ACID 到四种常见的并发问题
数据库·sql
瀚高PG实验室9 小时前
瀚高企业版V9.1.1在pg_restore还原备份文件时提示extract函数语法问题
数据库·瀚高数据库
TDengine (老段)10 小时前
TDengine Tag 设计哲学与 Schema 变更机制
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
YOU OU11 小时前
Spring IoC&DI
java·数据库·spring
Muscleheng11 小时前
Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错
数据库·postgresql
罗超驿12 小时前
18.事务的隔离性和隔离级别:MySQL面试高频考点全解析
数据库·mysql·面试
jran-12 小时前
Redis 命令
数据库·redis·缓存
小江的记录本13 小时前
【Java基础】Java 8-21新特性:JDK21 LTS:虚拟线程、模式匹配switch、结构化并发、序列集合(附《思维导图》+《面试高频考点清单》)
java·数据库·python·mysql·spring·面试·maven
June`13 小时前
多线程redis下如何解决aof重写和rdb持久化的数据一致性问题
数据库·redis·缓存