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,…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
