MYSQL LAG()与LEAD()的区别

吾爱主题 阅读:192 2023-05-17 13:23:00 评论:0

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

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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 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。
?
1 2 3 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偏移了两个。

?
1 2 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。
?
1 2 3 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。

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

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

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

原文链接:https://blog.csdn.net/Liuyan_analysis/article/details/121491107

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容