SQL偏移类窗口函数—— LAG()、LEAD()用法详解
SQL偏移类窗口函数:LAG() 和 LEAD() 用法详解

在 SQL 中,偏移类窗口函数 LAG() 和 LEAD() 用于访问当前行的前几行或后几行的值。
1. LAG() 函数

LAG() 函数返回当前行的前几行的数据。
LAG(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY [Expression]ORDER BY Expression [ASC|DESC]
);
- expression🍔: 你想要获取的列或表达式。
- offset🍟 (可选): 你希望向前偏移的行数。默认是 1,表示获取前一行的数据。
- default_value🍿 (可选): 如果当前行之前没有足够的行,返回的默认值。默认是
NULL,如果没有设置default_value,且当前行是窗口的第一行或没有前几行数据时,返回NULL。 - PARTITION BY🥓 (可选): 按某列分组计算窗口函数,类似于
GROUP BY。如果没有此项,整个数据集视为一个窗口。 - ORDER BY🥩: 按照某列排序,确定偏移的顺序。
Demo🍕🍕🍕🍕🍕🍕:
表格数据😎
sales 表,表结构和数据如下:
| id | month | revenue |
|---|---|---|
| 1 | Jan | 100 |
| 2 | Feb | 150 |
| 3 | Mar | 200 |
Demo🍕🍕:基础用法
使用 LAG() 函数来获取按月排序后的“revenue”列的前一行的值。
SELECT id, month, revenue, LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales;
| id | month | revenue | prev_revenue |
|---|---|---|---|
| 1 | Jan | 100 | NULL |
| 2 | Feb | 150 | 100 |
| 3 | Mar | 200 | 150 |
Tips🍬🍬:
- 第一行没有前一行,所以
prev_revenue为NULL。 - 第二行的
prev_revenue为第一行的revenue值(100)。 - 第三行的
prev_revenue为第二行的revenue值(150)。
Demo🍕🍕:带偏移量的 LAG() 函数
使用 LAG() 函数,并指定偏移量为 2,获取两行之前的“revenue”值。
SELECT id, month, revenue, LAG(revenue, 2) OVER (ORDER BY month) AS prev_revenue
FROM sales;
| id | month | revenue | prev_revenue |
|---|---|---|---|
| 1 | Jan | 100 | NULL |
| 2 | Feb | 150 | NULL |
| 3 | Mar | 200 | 100 |
Tips🍬🍬:
- 第一行和第二行都没有两行之前的记录,所以
prev_revenue为NULL。 - 第三行的
prev_revenue为第一行的revenue值(100)。
Demo🍕🍕:带默认值的 LAG() 函数
使用 LAG() 函数,并指定默认值为 0,当无法获取前一行的值时返回默认值。
SELECT id, month, revenue, LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales;
| id | month | revenue | prev_revenue |
|---|---|---|---|
| 1 | Jan | 100 | 0 |
| 2 | Feb | 150 | 100 |
| 3 | Mar | 200 | 150 |
Tips🍬🍬:
- 使用
LAG(revenue, 1, 0)来获取前一行的“revenue”值,如果没有前一行则返回默认值0。 - 第一行没有前一行,所以
prev_revenue为0。 - 第二行的
prev_revenue为第一行的revenue值(100)。 - 第三行的
prev_revenue为第二行的revenue值(150)。
Demo🍕🍕: LAG() 函数,比较每一天的销售额与前一天的销售额的差异。
SELECTsale_date,amount,LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS previous_day_amount,amount - LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS difference
FROM sales;
LAG(amount, 1, 0):这行的LAG函数表示获取前一天(前一行)的amount列的值,如果前一天没有数据(例如第一行),则返回0。- 通过
ORDER BY sale_date,确保按日期顺序排列数据。
| sale_date | amount | previous_day_amount | difference |
|---|---|---|---|
| 2025-01-01 | 100 | 0 | 100 |
| 2025-01-02 | 150 | 100 | 50 |
| 2025-01-03 | 200 | 150 | 50 |
| 2025-01-04 | 180 | 200 | -20 |
2. LEAD() 函数

LEAD() 函数与 LAG() 类似,但它返回的是当前行的后几行的数据。
LEAD(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY [Expression]ORDER BY Expression [ASC|DESC]
);
- expression🍔: 你想要获取的列或表达式。
- offset🍟 (可选): 你希望向前偏移的行数。默认是 1,表示获取前一行的数据。
- default_value🍿 (可选): 如果当前行之前没有足够的行,返回的默认值。默认是
NULL,如果没有设置default_value,且当前行是窗口的第一行或没有前几行数据时,返回NULL。 - PARTITION BY🥓 (可选): 按某列分组计算窗口函数,类似于
GROUP BY。如果没有此项,整个数据集视为一个窗口。 - ORDER BY🥩: 按照某列排序,确定偏移的顺序。
Demo🍕🍕:基础用法
使用 LEAD() 函数来获取按月排序后的“revenue”列的后一行的值。
SELECT id, month, revenue, LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales;
| id | month | revenue | next_revenue |
|---|---|---|---|
| 1 | Jan | 100 | 150 |
| 2 | Feb | 150 | 200 |
| 3 | Mar | 200 | NULL |
Tips🍬🍬:
- 第一行的
next_revenue为第二行的revenue值(150)。 - 第二行的
next_revenue为第三行的revenue值(200)。 - 第三行没有后续行,所以
next_revenue为NULL。
Demo🍕🍕:带偏移量的 LEAD() 函数
使用 LEAD() 函数,并指定偏移量为 2,获取两行之后的“revenue”值。
SELECT id, month,revenue, LEAD(revenue, 2) OVER (ORDER BY month) AS next_revenue
FROM sales;
| id | month | revenue | next_revenue |
|---|---|---|---|
| 1 | Jan | 100 | 200 |
| 2 | Feb | 150 | NULL |
| 3 | Mar | 200 | NULL |
Tips🍬🍬:
- 使用
LEAD(revenue, 2)来获取两行之后的“revenue”值。 - 第一行的
next_revenue为第三行的revenue值(200)。 - 第二行和第三行都没有两行之后的记录,所以
next_revenue为NULL。
Demo🍕🍕:带默认值的 LEAD() 函数
使用 LEAD() 函数,并指定默认值为 0,当无法获取后一行的值时返回默认值。
SELECT id, month, revenue, LEAD(revenue, 1, 0) OVER (ORDER BY month) AS next_revenue
FROM sales;
| id | month | revenue | next_revenue |
|---|---|---|---|
| 1 | Jan | 100 | 150 |
| 2 | Feb | 150 | 200 |
| 3 | Mar | 200 | 0 |
Tips🍬🍬:
- 使用
LEAD(revenue, 1, 0)来获取后一行的“revenue”值,如果没有后一行则返回默认值0。 - 第一行的
next_revenue为第二行的revenue值(150)。 - 第二行的
next_revenue为第三行的revenue值(200)。 - 第三行没有后一行,所以
next_revenue为0。
Demo🍕🍕:LEAD() 函数,比较每一天的销售额与下一天的销售额的差异。
SELECTsale_date,amount,LEAD(amount, 1, 0) OVER (ORDER BY sale_date) AS next_day_amount,LEAD(amount, 1, 0) OVER (ORDER BY sale_date) - amount AS difference
FROM sales;
LEAD(amount, 1, 0):这行的LEAD函数表示获取下一天(下一行)的amount列的值。如果下一天没有数据(例如最后一行),则返回0。- 通过
ORDER BY sale_date,确保按日期顺序排列数据。
| sale_date | amount | next_day_amount | difference |
|---|---|---|---|
| 2025-01-01 | 100 | 150 | 50 |
| 2025-01-02 | 150 | 200 | 50 |
| 2025-01-03 | 200 | 180 | -20 |
| 2025-01-04 | 180 | 0 | -180 |
最后再来一个小练习(lc会员题):查找电影院所有连续可用的座位。


WITH t1 AS (SELECTseat_id, -- 选择座位IDfree, -- 选择当前座位的空闲状态lag(free, 1, 999) OVER() AS pre, -- 获取当前座位前一个座位的空闲状态,默认值为 999lead(free, 1, 999) OVER() AS next -- 获取当前座位后一个座位的空闲状态,默认值为 999FROM Cinema -- 从 Cinema 表中选择数据
)SELECTseat_id -- 返回座位ID
FROM t1 -- 从 t1 子查询中选择数据
WHERE free = 1 -- 当前座位为空闲AND (pre = 1 OR next = 1) -- 前一个座位或后一个座位为空闲
ORDER BY seat_id; -- 按座位ID升序排序
思路:
-
lag(free, 1, 999)和lead(free, 1, 999):lag(free, 1, 999)用于获取当前座位前一个座位的free值(默认为 999,表示没有前一个座位)。lead(free, 1, 999)用于获取当前座位后一个座位的free值(默认为 999,表示没有后一个座位)。
-
free = 1和(pre = 1 OR next = 1):- 只选择当前座位是空闲的 (
free = 1)。 - 选择那些前一个或后一个座位也是空闲的 (
pre = 1 OR next = 1),表示这些座位是连续空闲的。
- 只选择当前座位是空闲的 (
-
ORDER BY seat_id:- 确保最终返回的结果按座位 ID 升序排序。
| seat_id | free |
|---|---|
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
| 5 | 1 |
通过执行查询,得到的 t1 子查询结果:
| seat_id | free | pre | next |
|---|---|---|---|
| 1 | 1 | 999 | 0 |
| 2 | 0 | 1 | 1 |
| 3 | 1 | 0 | 1 |
| 4 | 1 | 1 | 1 |
| 5 | 1 | 1 | 999 |
从 t1 中筛选出满足 free = 1 且 (pre = 1 OR next = 1) 的行,得到的结果:
| seat_id |
|---|
| 3 |
| 4 |
| 5 |
整理不易,一键三连呀列位🤣
相关文章:
SQL偏移类窗口函数—— LAG()、LEAD()用法详解
SQL偏移类窗口函数:LAG() 和 LEAD() 用法详解 在 SQL 中,偏移类窗口函数 LAG() 和 LEAD() 用于访问当前行的前几行或后几行的值。 1. LAG() 函数 LAG() 函数返回当前行的前几行的数据。 LAG(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY …...
基于Pytorch和yolov8n手搓安全帽目标检测的全过程
一.背景 还是之前的主题,使用开源软件为公司搭建安全管理平台,从视觉模型识别安全帽开始。主要参考学习了开源项目 https://github.com/jomarkow/Safety-Helmet-Detection,我是从运行、训练、标注倒过来学习的。由于工作原因,抽空…...
[CTF/网络安全] 攻防世界 upload1 解题详析
姿势 在txt中写入一句话木马<?php eval($_POST[qiu]);?> 回显如下: 查看源代码: Array.prototype.contains function (obj) { var i this.length; while (i--) { if (this[i] obj) { return true; } } return false; } function …...
03-其他
我们学校的教授们都还是很温柔,很有趣的,所以只要大家好好发挥,拿到90没问题的。 你以后打算研究什么? 你研究生的打算是什么?你计算机的前沿技术了解多少?(这个问题我真没了解过。。拉了&…...
EasyExcel自定义动态下拉框(附加业务对象转换功能)
全文直接复制粘贴即可,测试无误 一、注解类 1、ExcelSelected.java 设置下拉框 Documented Target({ElementType.FIELD})//用此注解用在属性上。 Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,…...
2025.1.2
练习: 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个…...
重庆大学软件工程复试怎么准备?
重大软件复试相对来说不算刁钻,关键是对自己的竞赛和项目足够了解,能应对老师的提问。专业课范围广,英文文献看个人水平,难度不算大,整体只要表现得得体从容,以及充分的准备,老师不会为难你。 …...
Ant Design Pro搭建react项目
1、使用pro-cli 来快速的初始化脚手架,先全局安装 npm i ant-design/pro-cli -g pro create myapp 2、选择模板类型 pro 是基础模板,只提供了框架运行的基本内容,complete 包含所有区块,不太适合当基础模板来进行二次开发。&a…...
mysql连接时报错1130-Host ‘hostname‘ is not allowed to connect to this MySQL server
不在mysql服务器上通过ip连接服务提示1130错误怎么回事呢。这个错误是因为在数据库服务器中的mysql数据库中的user的表中没有权限。 解决方案 查询mysql库的user表指定账户的连接方式 SELECT user, host FROM mysql.user;修改指定账户的host连接方式 update mysql.user se…...
办公 三之 Excel 数据限定录入与格式变换
开始-----条件格式------管理规则 IF($A4"永久",1,0) //如果A4包含永久,条件格式如下: OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…...
Ubuntu执行sudo apt-get update失败的解决方法
Ubuntu版本:24.04.1 报错信息: Clearsigned file isnt valid, got NOSPLIT (does the network require authentication?) 如果你在执行以上命令的时候也出现了上面这样的错误提示,先检查一下是不是网络问题,如果确定不是&…...
torch.nn.functional的用法
文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块,提供了许多函数式的神经网络操作,包括激活函数、损失函数、卷…...
最新常见的图数据库对比,选型,架构,性能对比
图数据库排名 地址:https://db-engines.com/en/ranking/graphdbms 知识图谱查询语言 SPARQL、Cypher、Gremlin、PGQL 和 G-CORE 语法 / 语义 / 特性 SPARQL Cypher Gremlin PGQL G-CORE 图模式匹配查询 语法 CGP CGP CGP(无可选)1 CGP CGP 语义 子…...
UE5材质节点Camera Vector/Reflection Vector
Camera Vector相机向量,输出像素到相机的方向,结果归一化 会随着相机移动而改变 Reflection Vector 反射向量,物体表面法线反射到相机的方向,x和y和camera vector相反 配合hdr使用...
NextCloud服务安装与配置教程
NextCloud服务安装与配置教程 什么是 NextCloud: Nextcloud 是一款开源的私有云存储和协作平台,允许用户在自己的服务器上托管数据并管理团队协作。它可以作为一个功能丰富、安全可靠的替代方案,与商业云服务(如 Google Drive、Dropbox)相比提供更多控制和隐私保护。简单来…...
详解GPT-信息抽取任务 (GPT-3 FAMILY LARGE LANGUAGE MODELS)
GPT-3 FAMILY LARGE LANGUAGE MODELS Information Extraction 自然语言处理信息提取任务(NLP-IE):从非结构化文本数据中提取结构化数据,例如提取实体、关系和事件 [164]。将非结构化文本数据转换为结构化数据可以实现高效的数据处…...
华为数通考试模拟真题(附带答案解析)题库领取
【多选题】 管理员想要更新华为路由器的VRP版本,则正确的方法有? A管理员把路由器配置为FTP服务器,通过FTP来传输VRP软件 B:管理员把路由器置为FTP客户端,通过FTP来传输VRP软件 C:管理员把路由器配置为TFTP客户端,通过TFTP来传…...
微信小程序:正确输出<小于,大于>符号
错误写法 1、如果直接输入<符号会直接报错,>能正常使用,如图标红的是错误写法 2、输入html的<>的写法,会原样输入符号 解决方法 采用变量的方式输出 1、js写入变量 2、wxml直接写...
Flink源码解析之:如何根据算法生成StreamGraph过程
Flink源码解析之:如何根据算法生成StreamGraph过程 在我们日常编写Flink应用的时候,会首先创建一个StreamExecutionEnvironment.getExecutionEnvironment()对象,在添加一些自定义处理算子后,会调用env.execute来执行定义好的Flin…...
矩阵简单问题(Java)
问题: 顺时针打印二维方阵: 1 2 3 4 15 5 6 7 8 14 9 10 11 12 13 13 14 15 16 public class Test1 {public static void main(String[] args) {int[][] arr new int[][]{{1, 2, 3, 4,100},{5, 6, 7, 8,101},{9, 10, 11, 12,102},{13, 14, 15, 16,…...
BG3ModManager:博德之门3模组管理终极解决方案
BG3ModManager:博德之门3模组管理终极解决方案 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 你是否曾经为《博德之门3》的模组管理而烦…...
深度解析:Performance-Fish如何通过四级缓存架构实现《环世界》400%性能优化
深度解析:Performance-Fish如何通过四级缓存架构实现《环世界》400%性能优化 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish Performance-Fish是《环世界》(Rim…...
多模态AI实战:基于OpenGVLab/Ask-Anything构建视觉问答系统
1. 项目概述:当视觉大模型学会“看图说话”最近在折腾多模态AI应用,发现了一个挺有意思的开源项目,叫OpenGVLab/Ask-Anything。简单来说,它就像一个给AI装上了“眼睛”和“嘴巴”的系统,你给它一张图片或一段视频&…...
VS Code光标主题定制指南:提升开发效率与视觉舒适度
1. 项目概述:一个为开发者量身定制的光标主题集合如果你和我一样,每天有超过8个小时的时间是在代码编辑器里度过的,那么你一定对那个在屏幕上闪烁的光标再熟悉不过了。它不仅仅是文本插入点,更是我们思维在数字世界中的延伸。然而…...
m4s-converter终极指南:如何无损转换B站缓存视频并保留弹幕
m4s-converter终极指南:如何无损转换B站缓存视频并保留弹幕 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在数字内容日益丰富的今天…...
紧急更新!Midjourney 6.2.1已悄然修复碳素印相的硫化银衰减模拟缺陷——但97%用户仍在用旧参数,立即校准你的工作流
更多请点击: https://intelliparadigm.com 第一章:碳素印相的视觉本质与Midjourney 6.2.1修复的底层动因 碳素印相的物质性光感逻辑 碳素印相并非数字渲染的模拟,而是一种基于明胶-碳黑颗粒物理沉积的连续调成像工艺。其高密度阴影区呈现哑…...
基于MCP协议构建AI金融数据可视化服务器:从原理到实战部署
1. 项目概述:一个为AI智能体提供实时金融数据可视化的MCP服务器最近在折腾AI智能体(Agent)的生态,发现一个挺有意思的痛点:当你想让AI帮你分析股票、基金或者加密货币时,它往往只能给你干巴巴的数字和文字描…...
【限时解密】ElevenLabs未文档化的/v1/text-to-speech/{voice_id}/with-timing接口:获取逐词时间戳+音素级对齐数据(仅剩3个Beta白名单通道)
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs英文语音生成的核心能力与技术定位 ElevenLabs 是当前业界领先的 AI 语音合成平台,其英文语音生成能力建立在自研的端到端神经声学模型(如 ElevenMultilingualV2&…...
【Clickhouse从入门到精通】第03篇:ClickHouse适用场景深度剖析
上一篇【第02篇】ClickHouse横空出世——天下武功唯快不破 下一篇【第04篇】ClickHouse生态全景与生产实践者巡礼 摘要 技术选型是数据架构设计的核心命题。再优秀的工具,若用错了场景,也会事倍功半。ClickHouse 以"极速分析查询"著称&#x…...
Spring Kafka监听多个Topic时,如何避免消费者‘摸鱼’?聊聊Range和RoundRobin分配策略的选择
Spring Kafka多Topic监听场景下消费者分配策略深度优化 1. 问题背景:当消费者开始"摸鱼" 在分布式消息系统中,Kafka凭借其高吞吐、低延迟的特性成为众多企业的首选。然而在实际开发中,不少团队遇到过这样的尴尬场景:明明…...
