MySQL LAG和LEAD函数用法详解

在 MySQL 中,LAG()LEAD() 是窗口函数(Window Functions),用于访问结果集中当前行之前或之后的行中的数据。它们常用于计算差值、趋势分析或时间序列比较。


1. LAG() 函数

作用:访问当前行之前的指定偏移量(offset)处的数据。
语法

LAG(column, offset, default_value) OVER (
    [PARTITION BY partition_expression]
    ORDER BY sort_expression [ASC|DESC]
)
  • column:要获取值的列名。
  • offset(可选):向前回溯的行数(默认 1)。
  • default_value(可选):当没有前一行时返回的值(默认 NULL)。
  • PARTITION BY(可选):将数据分区,函数在分区内独立计算。
  • ORDER BY:定义分区内行的排序顺序。
示例:获取前一天的销售额
SELECT 
    sale_date,
    amount,
    LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS prev_day_amount
FROM sales;

结果:

sale_dateamountprev_day_amount
2023-01-011000
2023-01-02200100
2023-01-03150200

2. LEAD() 函数

作用:访问当前行之后的指定偏移量处的数据。
语法

LEAD(column, offset, default_value) OVER (
    [PARTITION BY partition_expression]
    ORDER BY sort_expression [ASC|DESC]
)

参数含义与 LAG() 相同,方向相反。

示例:获取后一天的销售额
SELECT 
    sale_date,
    amount,
    LEAD(amount, 1, 0) OVER (ORDER BY sale_date) AS next_day_amount
FROM sales;

结果:

sale_dateamountnext_day_amount
2023-01-01100200
2023-01-02200150
2023-01-031500

3. 分区使用示例(PARTITION BY

按产品分区,分别计算每个产品的前后订单金额:

SELECT 
    product_id,
    order_date,
    amount,
    LAG(amount) OVER (
        PARTITION BY product_id 
        ORDER BY order_date
    ) AS prev_amount,
    LEAD(amount) OVER (
        PARTITION BY product_id 
        ORDER BY order_date
    ) AS next_amount
FROM orders;

结果:

product_idorder_dateamountprev_amountnext_amount
A2023-01-01100NULL200
A2023-01-02200100150
A2023-01-03150200NULL
B2023-01-0150NULL80
B2023-01-028050NULL

4. 实际应用场景

计算日环比变化
SELECT 
    sale_date,
    amount,
    LAG(amount, 1, amount) OVER (ORDER BY sale_date) AS prev_amount,
    (amount - LAG(amount, 1, amount) OVER (ORDER BY sale_date)) AS diff
FROM sales;
检测数据间断(如缺失日期)
SELECT 
    date,
    LEAD(date) OVER (ORDER BY date) AS next_date,
    DATEDIFF(LEAD(date) OVER (ORDER BY date), date) AS day_gap
FROM events
HAVING day_gap > 1;  -- 查找间隔大于1天的日期

注意事项

  1. MySQL 版本要求LAG()LEAD()MySQL 8.0+(早期版本不支持)。
  2. 必须搭配 OVER() 子句:定义窗口分区和排序。
  3. 默认值 default_value 可省略,此时无前/后行时返回 NULL
  4. 性能:对大数据集建议在 ORDER BY 列上建立索引。

通过灵活使用偏移量和分区,可以高效实现跨行数据分析需求。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走过冬季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值