MYSQL LAG()与LEAD()的区别

 更新时间:2023年05月16日 10:30:21   作者:蚂蚁*漫步  
MYSQL LAG()与LEAD()这两个函数是偏移量函数,可以查出一个字段的前面N个值或者后面N个值,本文详细的介绍一下这两个函数的区别,感兴趣的可以了解一下

这两个函数是偏移量函数,可以查出一个字段的前面N个值或者后面N个值,配合over来使用。

下面举例说明,新建表格如下:

drop table if exists exam_record;
CREATE TABLE exam_record (
    id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid int NOT NULL COMMENT '用户ID',
    exam_id int NOT NULL COMMENT '试卷ID',
    start_time datetime NOT NULL COMMENT '开始时间',
    submit_time datetime COMMENT '提交时间',
    score tinyint COMMENT '得分'
)CHARACTER SET utf8 COLLATE utf8_general_ci;
INSERT INTO exam_record(uid,exam_id,start_time,submit_time,score) VALUES
(1001, 9001, '2020-01-01 09:01:01', '2020-01-01 09:21:59', 90),
(1002, 9001, '2020-01-20 10:01:01', '2020-01-20 10:10:01', 89),
(1002, 9001, '2020-02-01 12:11:01', '2020-02-01 12:31:01', 83),
(1003, 9001, '2020-03-01 19:01:01', '2020-03-01 19:30:01', 75),
(1004, 9001, '2020-03-01 12:01:01', '2020-03-01 12:11:01', 60),
(1003, 9001, '2020-03-01 12:01:01', '2020-03-01 12:41:01', 90),
(1002, 9001, '2020-05-02 19:01:01', '2020-05-02 19:32:00', 90),
(1001, 9002, '2020-01-02 19:01:01', '2020-01-02 19:59:01', 69),
(1004, 9002, '2020-02-02 12:01:01', '2020-02-02 12:20:01', 99),
(1003, 9002, '2020-02-02 12:01:01', '2020-02-02 12:31:01', 68),
(1001, 9002, '2020-02-02 12:01:01', '2020-02-02 12:43:01', 81),
(1001, 9002, '2020-03-02 12:11:01', null, null);

 1.lag()

语法:lag(expr,N,default)

  • expr:它可以是列或任何内置函数。
  • N:它是一个正值,它确定当前行之前的行数。如果在查询中将其省略,则其默认值为1
  • default:如果在当前行之前没有行N行的情况下,它是函数返回的默认值。如果缺少,则默认为NULL。
select *,lag(start_time,1) over(order by id)lad_1,
lag(uid,2) over(order by id)lad_2 
from exam_record

可以看到所有的start_time都等于前面一个的start_time,前面没有的填充NULL,设置lag()里面的参数为2,可以看到所有的uid偏移了两个。

select *,lag(start_time,2,0) over(partition by uid order by id)lag_1
from exam_record

根据uid分组对start_time向前移动2个单元,然后设置NULL值默认填充为0. 可以自己体会一下数据的移动方式。

2.lead()

语法:lead(expr,N,default)

  • expr:它可以是列或任何内置函数。
  • N:它是一个正值,它确定当前行之后的行数。如果在查询中将其省略,则其默认值为1
  • default:如果在当前行之后没有行N行的情况下,它是函数返回的默认值。如果缺少,则默认为NULL。
select *,lead(start_time,1) over(order by id)lead_1,
lead(uid,2) over(order by id)lead_2 
from exam_record

可以看到所有的start_time都等于后面一个的start_time,后面没有的填充NULL,设置lead()里面的参数为2,可以看到所有的uid都等于后面第二个的uid。

select *,lead(start_time,1) over(partition by uid order by id)lead_1
from exam_record

 还可以根据uid进行分组,然后再进行偏移。

到此这篇关于MYSQL LAG()与LEAD()的区别的文章就介绍到这了,更多相关MYSQL LAG() LEAD()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql自增长id用完了该怎么办

    mysql自增长id用完了该怎么办

    如果你用过或了解过MySQL,那你一定知道自增主键了,下面这篇文章主要给大家介绍了关于mysql自增长id用完了该怎么办的相关资料,需要的朋友可以参考下
    2022-02-02
  • 将图片储存在MySQL数据库中的几种方法

    将图片储存在MySQL数据库中的几种方法

    今天小编就为大家分享一篇关于将图片储存在MySQL数据库中的几种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mysql如何在存储过程中输出日志信息

    mysql如何在存储过程中输出日志信息

    这篇文章主要介绍了mysql如何在存储过程中输出日志信息问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • MAC下MySQL忘记初始密码怎么办

    MAC下MySQL忘记初始密码怎么办

    MySQL初始密码忘记怎么办,这篇文章主要介绍了MAC下MySQL忘记初始密码的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • mysql中文显示为问号?的问题及解决

    mysql中文显示为问号?的问题及解决

    这篇文章主要介绍了mysql中文显示为问号?的问题及解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法详解

    连接MySQL出现Host is not allowed to con

    这篇文章主要给大家介绍了连接MySQL出现Host is not allowed to connect to this MySQL server 解决方法,文中有详细的解决步骤,需要的朋友可以参考下
    2023-08-08
  • mysql5.7及mysql 8.0版本修改root密码的方法小结

    mysql5.7及mysql 8.0版本修改root密码的方法小结

    这篇文章主要介绍了mysql5.7及mysql 8.0版本修改root密码方式 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • Mysql中SUM()函数使用方法

    Mysql中SUM()函数使用方法

    这篇文章主要给大家介绍了关于Mysql中SUM()函数使用的相关资料,MySQL 的 SUM 函数可以用来对某个列进行求和,但是如果你想要按照某个条件进行求和,可以使用带有WHERE子句的SUM函数,需要的朋友可以参考下
    2023-08-08
  • MySQL日志配置与查看方法

    MySQL日志配置与查看方法

    作为数据库管理员,我曾多次遇到因日志配置不当导致的线上故障,今天我将结合多年一线运维经验,系统讲解MySQL五大核心日志的配置与查看方法,并附上实际生产环境中的排错案例,需要的朋友可以参考下
    2025-09-09
  • SQL多个字段拼接组合成新字段的常用方法

    SQL多个字段拼接组合成新字段的常用方法

    在sql语句中,有时候我们可能需要将两个字段的值放在一起显示,因为他们通常是一起出现的,比如客户名称和客户编号,那我们就要将这两个字段拼接成一个字段,本文给大家介绍了几种常见的方法,需要的朋友可以参考下
    2024-02-02

最新评论