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

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

偏移类窗口函数: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

整理不易,一键三连呀列位


http://www.mrgr.cn/news/82184.html

相关文章:

  • 【杂谈】-AI搜索引擎如何改变传统SEO及其在内容营销中的作用
  • 用css实现瀑布流布局
  • [C++刷题] 统计数字字符个数
  • 单片机-蜂鸣器实验
  • 虚拟机中的时统卡功能和性能调优
  • 对比式机器学习揭示了跨物种共享和特异性的脑功能结构|文献速递-视觉大模型医疗图像应用
  • 【Kafka 消息队列深度解析与应用】
  • 【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问
  • 【分布式缓存中间件Memcached原理与应用】
  • 面试题汇总
  • GXUOJ-算法-第四次作业(圆排列、连续邮资、n皇后、符号三角形)
  • 【非关系型数据库Redis 】 入门
  • primevue的<Menu>组件
  • 基于 Node.js 的 ORM(对象关系映射)工具——Sequelize介绍与使用,并举案例分析
  • 【循环神经网络】RNN介绍
  • 【容器化技术 Docker 与微服务部署】详解
  • 基于WSL在Windows下安装Ubuntu
  • C++ 设计模式:组合模式(Composite Pattern)
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之12 方案再探之3:特定于领域的模板 之2 首次尝试和遗留问题解决
  • 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
  • libvirt学习
  • 【Compose multiplatform教程24】导航与路由
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之11 方案再探之2 项目文件(修改稿1)
  • Linux2.4.20顶层Makefile文件分析
  • 我的Java-Web进阶--Spring
  • CPT203 Software Engineering 软件工程 Pt.2 敏捷方法和需求工程(中英双语)