SQL中LAG、LEAD函数功能及用法

 更新时间:2025年09月28日 15:01:55   作者:Agnesgogogo  
SQL中LAG和LEAD函数用于访问结果集前后行数据,LAG取前N行,LEAD取后N行,支持偏移量和默认值,常用于计算环比、填充缺失值、趋势预测等场景,本文给大家介绍SQL中LAG、LEAD函数功能及用法,感兴趣的朋友一起看看吧

SQL中的LAG和LEAD函数是用于访问结果集中当前行前后数据的窗口函数,主要功能及用法如下:

一、函数定义

1‌、LAG函数
获取当前行之前的第N行数据,语法:

LAG(column, offset, default) OVER ([PARTITION BY] ORDER BY)

1、column:目标列名

2、offset:向前偏移的行数(默认1)

3、default:无数据时的默认值(默认NULL)

2、LEAD函数 获取当前行之后的第N行数据,语法与LAG类似(方向相反)  

LEAD(column, offset, default) OVER ([PARTITION BY] ORDER BY)

1、column:目标列名

2、offset:向前偏移的行数(默认1)

3、default:无数据时的默认值(默认NULL)

二、核心功能对比

函数方向典型应用场景
LAG向前计算环比、填充缺失值、异常检测
LEAD向后预测趋势、计算后续差值

三、使用示例

1、查询销售额及前一日数据:

SELECT 
    date,
    revenue,
    LAG(revenue, 1, 0) OVER (ORDER BY date) AS prev_revenue
FROM sales

结果中prev_revenue列显示前一日的销售额,首行默认值为0

2、按部门查询员工工资及前一位同事工资:

SELECT 
    deptno,
    empname,
    salary,
    LAG(salary) OVER (PARTITION BY deptno ORDER BY hiredate) AS prev_salary
FROM emp

通过PARTITION BY实现分组内偏移

3、计算每日销售额变化量:

SELECT 
    date,
    revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM sales

4、查询连续3天下单的customer_name,比如zhangsan在12.1、12.2号和12.3号连续3天下单过

补充:TIMESTAMPDIFF函数

TIMESTAMPDIFF(DAY, buy_date, next1_buy_date) 

是 MySQL 中用于计算两个日期之间天数差的函数,其功能解析如下:

函数结构:

1、参数1 DAY:指定返回结果的时间单位(此处为天数)

2、参数2 buy_date:起始日期(较早时间点)

3、参数3 next1_buy_date:结束日期(较晚时间点)

4、返回值:next1_buy_date - buy_date 的天数差(整数,向下取整)

-- 写法一
select
customer_name
from 
(
select 
customer_name,
buy_date,
lag(buy_date,1) over(partition by customer_name order by buy_date) as next1_buy_date
lead(buy_date,1) over(partition by customer_name order by buy_date) as next1_buy_date
from
order_table
)
where
TIMESTAMPDIFF(day,buy_date,next1_buy_date) = -1
and
TIMESTAMPDIFF(day,buy_date,next2_buy_date) = 1;
-- 写法二
select
customer_name
from 
(
select 
customer_name,
buy_date,
lag(buy_date,1) over(partition by customer_name order by buy_date) as next1_buy_date
lag(buy_date,2) over(partition by customer_name order by buy_date) as next1_buy_date
from
order_table
)
where
TIMESTAMPDIFF(day,buy_date,next1_buy_date) = -1
and
TIMESTAMPDIFF(day,buy_date,next2_buy_date) = -2;

到此这篇关于SQL中LAG、LEAD函数功能及用法的文章就介绍到这了,更多相关sql lag lead函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SQL Server限制IP访问数据库的设置方法

    SQL Server限制IP访问数据库的设置方法

    这篇文章主要介绍了SQL Server限制IP访问数据库的设置方法及注意事项,因监控中用到高权限的用户,想像mysql一样针对这个帐号对IP限制,本文通过图文介绍的非常详细,需要的朋友可以参考下
    2025-10-10
  • 一文详解嵌入式SQL

    一文详解嵌入式SQL

    本文主要介绍了一文详解嵌入式SQL,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • SQL 查询性能优化 解决书签查找

    SQL 查询性能优化 解决书签查找

    当优化器所选择的非聚簇索引只包含查询请求的一部分字段时,就需要一个查找(lookup)来检索其他字段来满足请求
    2012-08-08
  • SQL Server日期计算

    SQL Server日期计算

    SQL Server日期计算...
    2007-03-03
  • sql 多表连接查询

    sql 多表连接查询

    sql 多表连接查询语句代码,大家可以参考下。
    2009-06-06
  • 分享一下SQL Server执行动态SQL的正确方式

    分享一下SQL Server执行动态SQL的正确方式

    这篇文章主要介绍了SQL Server执行动态SQL正确方式,需要的朋友可以参考下
    2017-06-06
  • SQL中的UNION ALL和UNION 区别及如何使用

    SQL中的UNION ALL和UNION 区别及如何使用

    UNIONALL是SQL中用于合并两个或多个SELECT查询结果集的操作符,其核心特点是保留所有行,下面从语法、使用条件、示例、性能特点及注意事项等方面系统讲解 UNION ALL 的使用方法,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • SQL server 自增ID--序号自动增加的字段操作

    SQL server 自增ID--序号自动增加的字段操作

    这篇文章主要介绍了SQL server 自增ID--序号自动增加的字段操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • sql删除重复数据的详细方法

    sql删除重复数据的详细方法

    重复数据,通常有两种:一是完全重复的记录,也就是所有字段的值都一样;二是部分字段值重复的记录
    2013-05-05
  • SQL Server日期时间和字符串之间的转换方法实例

    SQL Server日期时间和字符串之间的转换方法实例

    处理原始数据时,您可能经常会遇到存储为文本的日期值,将这些值转换为日期数据类型非常重要,因为在分析过程中日期可能更有价值,下面这篇文章主要给大家介绍了关于SQL Server日期时间和字符串之间的转换方法,需要的朋友可以参考下
    2023-06-06

最新评论