MYSQL LAG()與LEAD()的區(qū)別
這兩個函數(shù)是偏移量函數(shù),可以查出一個字段的前面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:它可以是列或任何內置函數(shù)。
- N:它是一個正值,它確定當前行之前的行數(shù)。如果在查詢中將其省略,則其默認值為1
- default:如果在當前行之前沒有行N行的情況下,它是函數(shù)返回的默認值。如果缺少,則默認為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()里面的參數(shù)為2,可以看到所有的uid偏移了兩個。
select *,lag(start_time,2,0) over(partition by uid order by id)lag_1 from exam_record
根據(jù)uid分組對start_time向前移動2個單元,然后設置NULL值默認填充為0. 可以自己體會一下數(shù)據(jù)的移動方式。
2.lead()
語法:lead(expr,N,default)
- expr:它可以是列或任何內置函數(shù)。
- N:它是一個正值,它確定當前行之后的行數(shù)。如果在查詢中將其省略,則其默認值為1
- default:如果在當前行之后沒有行N行的情況下,它是函數(shù)返回的默認值。如果缺少,則默認為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()里面的參數(shù)為2,可以看到所有的uid都等于后面第二個的uid。
select *,lead(start_time,1) over(partition by uid order by id)lead_1 from exam_record
還可以根據(jù)uid進行分組,然后再進行偏移。
到此這篇關于MYSQL LAG()與LEAD()的區(qū)別的文章就介紹到這了,更多相關MYSQL LAG() LEAD()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
原來MySQL?數(shù)據(jù)類型也可以優(yōu)化
這篇文章主要介紹了原來MySQL?數(shù)據(jù)類型也可以優(yōu)化,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助2022-08-08MySQL執(zhí)行update語句和原數(shù)據(jù)相同會再次執(zhí)行嗎
這篇文章主要給大家介紹了關于MySQL執(zhí)行update語句和原數(shù)據(jù)相同是否會再次執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用MySQL具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04mysql 連接出現(xiàn)Public Key Retrieval is n
在MySQL連接中出現(xiàn)“Public Key Retrieval is not allowed”錯誤,通常是因為在使用安全套接字層(SSL)連接時遇到了問題,本文就來介紹一下解決方法,感興趣的可以了解一下2024-03-03