当前位置: 首页 > news >正文

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 表,表结构和数据如下:

idmonthrevenue
1Jan100
2Feb150
3Mar200

Demo🍕🍕:基础用法

使用 LAG() 函数来获取按月排序后的“revenue”列的前一行的值

SELECT  id, month, revenue, LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales;
idmonthrevenueprev_revenue
1Jan100NULL
2Feb150100
3Mar200150

Tips🍬🍬:

  • 第一行没有前一行,所以 prev_revenueNULL
  • 第二行的 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;
idmonthrevenueprev_revenue
1Jan100NULL
2Feb150NULL
3Mar200100

Tips🍬🍬:

  • 第一行和第二行都没有两行之前的记录,所以 prev_revenueNULL
  • 第三行的 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;
idmonthrevenueprev_revenue
1Jan1000
2Feb150100
3Mar200150

Tips🍬🍬:

  • 使用 LAG(revenue, 1, 0) 来获取前一行的“revenue”值,如果没有前一行则返回默认值 0
  • 第一行没有前一行,所以 prev_revenue0
  • 第二行的 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_dateamountprevious_day_amountdifference
2025-01-011000100
2025-01-0215010050
2025-01-0320015050
2025-01-04180200-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;
idmonthrevenuenext_revenue
1Jan100150
2Feb150200
3Mar200NULL

Tips🍬🍬:

  • 第一行的 next_revenue 为第二行的 revenue 值(150)。
  • 第二行的 next_revenue 为第三行的 revenue 值(200)。
  • 第三行没有后续行,所以 next_revenueNULL

Demo🍕🍕:带偏移量的 LEAD() 函数

使用 LEAD() 函数,并指定偏移量为 2,获取两行之后的“revenue”值。

SELECT  id, month,revenue, LEAD(revenue, 2) OVER (ORDER BY month) AS next_revenue
FROM sales;
idmonthrevenuenext_revenue
1Jan100200
2Feb150NULL
3Mar200NULL

Tips🍬🍬:

  • 使用 LEAD(revenue, 2) 来获取两行之后的“revenue”值。
  • 第一行的 next_revenue 为第三行的 revenue 值(200)。
  • 第二行和第三行都没有两行之后的记录,所以 next_revenueNULL

Demo🍕🍕:带默认值的 LEAD() 函数

使用 LEAD() 函数,并指定默认值为 0,当无法获取后一行的值时返回默认值。

SELECT id, month, revenue, LEAD(revenue, 1, 0) OVER (ORDER BY month) AS next_revenue
FROM sales;
idmonthrevenuenext_revenue
1Jan100150
2Feb150200
3Mar2000

Tips🍬🍬:

  • 使用 LEAD(revenue, 1, 0) 来获取后一行的“revenue”值,如果没有后一行则返回默认值 0
  • 第一行的 next_revenue 为第二行的 revenue 值(150)。
  • 第二行的 next_revenue 为第三行的 revenue 值(200)。
  • 第三行没有后一行,所以 next_revenue0

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_dateamountnext_day_amountdifference
2025-01-0110015050
2025-01-0215020050
2025-01-03200180-20
2025-01-041800-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升序排序

思路:

  1. lag(free, 1, 999)lead(free, 1, 999):

    • lag(free, 1, 999) 用于获取当前座位前一个座位的 free 值(默认为 999,表示没有前一个座位)。
    • lead(free, 1, 999) 用于获取当前座位后一个座位的 free 值(默认为 999,表示没有后一个座位)。
  2. free = 1(pre = 1 OR next = 1):

    • 只选择当前座位是空闲的 (free = 1)。
    • 选择那些前一个或后一个座位也是空闲的 (pre = 1 OR next = 1),表示这些座位是连续空闲的。
  3. ORDER BY seat_id:

    • 确保最终返回的结果按座位 ID 升序排序。

seat_idfree
11
20
31
41
51

通过执行查询,得到的 t1 子查询结果:

seat_idfreeprenext
119990
2011
3101
4111
511999

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]);?> 回显如下&#xff1a; 查看源代码&#xff1a; Array.prototype.contains function (obj) { var i this.length; while (i--) { if (this[i] obj) { return true; } } return false; } function …...

03-其他

我们学校的教授们都还是很温柔&#xff0c;很有趣的&#xff0c;所以只要大家好好发挥&#xff0c;拿到90没问题的。 你以后打算研究什么&#xff1f; 你研究生的打算是什么&#xff1f;你计算机的前沿技术了解多少&#xff1f;&#xff08;这个问题我真没了解过。。拉了&…...

EasyExcel自定义动态下拉框(附加业务对象转换功能)

全文直接复制粘贴即可&#xff0c;测试无误 一、注解类 1、ExcelSelected.java 设置下拉框 Documented Target({ElementType.FIELD})//用此注解用在属性上。 Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中&#xff0c;jvm加载class文件之后&#xff0c…...

2025.1.2

练习&#xff1a; 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xf…...

重庆大学软件工程复试怎么准备?

重大软件复试相对来说不算刁钻&#xff0c;关键是对自己的竞赛和项目足够了解&#xff0c;能应对老师的提问。专业课范围广&#xff0c;英文文献看个人水平&#xff0c;难度不算大&#xff0c;整体只要表现得得体从容&#xff0c;以及充分的准备&#xff0c;老师不会为难你。 …...

Ant Design Pro搭建react项目

1、使用pro-cli 来快速的初始化脚手架&#xff0c;先全局安装 npm i ant-design/pro-cli -g pro create myapp 2、选择模板类型 pro 是基础模板&#xff0c;只提供了框架运行的基本内容&#xff0c;complete 包含所有区块&#xff0c;不太适合当基础模板来进行二次开发。&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包含永久&#xff0c;条件格式如下&#xff1a; OR($D5<60,$E5<60,$F5<60) 求取任意科目不及格数据 AND($D5<60,$E5<60,$F5<60) 若所有科目都不及格 显示为红色 IF($H4<EDATE…...

Ubuntu执行sudo apt-get update失败的解决方法

Ubuntu版本&#xff1a;24.04.1 报错信息&#xff1a; Clearsigned file isnt valid, got NOSPLIT (does the network require authentication?) 如果你在执行以上命令的时候也出现了上面这样的错误提示&#xff0c;先检查一下是不是网络问题&#xff0c;如果确定不是&…...

torch.nn.functional的用法

文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块&#xff0c;提供了许多函数式的神经网络操作&#xff0c;包括激活函数、损失函数、卷…...

最新常见的图数据库对比,选型,架构,性能对比

图数据库排名 地址&#xff1a;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相机向量&#xff0c;输出像素到相机的方向&#xff0c;结果归一化 会随着相机移动而改变 Reflection Vector 反射向量&#xff0c;物体表面法线反射到相机的方向&#xff0c;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 自然语言处理信息提取任务&#xff08;NLP-IE&#xff09;&#xff1a;从非结构化文本数据中提取结构化数据&#xff0c;例如提取实体、关系和事件 [164]。将非结构化文本数据转换为结构化数据可以实现高效的数据处…...

华为数通考试模拟真题(附带答案解析)题库领取

【多选题】 管理员想要更新华为路由器的VRP版本&#xff0c;则正确的方法有? A管理员把路由器配置为FTP服务器&#xff0c;通过FTP来传输VRP软件 B:管理员把路由器置为FTP客户端&#xff0c;通过FTP来传输VRP软件 C:管理员把路由器配置为TFTP客户端&#xff0c;通过TFTP来传…...

微信小程序:正确输出<小于,大于>符号

错误写法 1、如果直接输入<符号会直接报错&#xff0c;>能正常使用&#xff0c;如图标红的是错误写法 2、输入html的<&gt的写法&#xff0c;会原样输入符号 解决方法 采用变量的方式输出 1、js写入变量 2、wxml直接写...

Flink源码解析之:如何根据算法生成StreamGraph过程

Flink源码解析之&#xff1a;如何根据算法生成StreamGraph过程 在我们日常编写Flink应用的时候&#xff0c;会首先创建一个StreamExecutionEnvironment.getExecutionEnvironment()对象&#xff0c;在添加一些自定义处理算子后&#xff0c;会调用env.execute来执行定义好的Flin…...

矩阵简单问题(Java)

问题&#xff1a; 顺时针打印二维方阵&#xff1a; 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,…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...