SQL中LAG、LEAD函數(shù)功能及用法
SQL中的LAG和LEAD函數(shù)是用于訪問結(jié)果集中當(dāng)前行前后數(shù)據(jù)的窗口函數(shù),主要功能及用法如下:
一、函數(shù)定義
1、LAG函數(shù)
獲取當(dāng)前行之前的第N行數(shù)據(jù),語法:
LAG(column, offset, default) OVER ([PARTITION BY] ORDER BY)
1、column:目標(biāo)列名
2、offset:向前偏移的行數(shù)(默認(rèn)1)
3、default:無數(shù)據(jù)時的默認(rèn)值(默認(rèn)NULL)
2、LEAD函數(shù) 獲取當(dāng)前行之后的第N行數(shù)據(jù),語法與LAG類似(方向相反)
LEAD(column, offset, default) OVER ([PARTITION BY] ORDER BY)
1、column:目標(biāo)列名
2、offset:向前偏移的行數(shù)(默認(rèn)1)
3、default:無數(shù)據(jù)時的默認(rèn)值(默認(rèn)NULL)
二、核心功能對比
| 函數(shù) | 方向 | 典型應(yīng)用場景 |
|---|---|---|
| LAG | 向前 | 計算環(huán)比、填充缺失值、異常檢測 |
| LEAD | 向后 | 預(yù)測趨勢、計算后續(xù)差值 |
三、使用示例
1、查詢銷售額及前一日數(shù)據(jù):
SELECT
date,
revenue,
LAG(revenue, 1, 0) OVER (ORDER BY date) AS prev_revenue
FROM sales結(jié)果中prev_revenue列顯示前一日的銷售額,首行默認(rèn)值為0
2、按部門查詢員工工資及前一位同事工資:
SELECT
deptno,
empname,
salary,
LAG(salary) OVER (PARTITION BY deptno ORDER BY hiredate) AS prev_salary
FROM emp通過PARTITION BY實(shí)現(xiàn)分組內(nèi)偏移
3、計算每日銷售額變化量:
SELECT
date,
revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM sales4、查詢連續(xù)3天下單的customer_name,比如zhangsan在12.1、12.2號和12.3號連續(xù)3天下單過
補(bǔ)充:TIMESTAMPDIFF函數(shù)
TIMESTAMPDIFF(DAY, buy_date, next1_buy_date)
是 MySQL 中用于計算兩個日期之間天數(shù)差的函數(shù),其功能解析如下:
函數(shù)結(jié)構(gòu):
1、參數(shù)1 DAY:指定返回結(jié)果的時間單位(此處為天數(shù))
2、參數(shù)2 buy_date:起始日期(較早時間點(diǎn))
3、參數(shù)3 next1_buy_date:結(jié)束日期(較晚時間點(diǎn))
4、返回值:next1_buy_date - buy_date 的天數(shù)差(整數(shù),向下取整)
-- 寫法一 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;
到此這篇關(guān)于SQL中LAG、LEAD函數(shù)功能及用法的文章就介紹到這了,更多相關(guān)sql lag lead函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL Server限制IP訪問數(shù)據(jù)庫的設(shè)置方法
這篇文章主要介紹了SQL Server限制IP訪問數(shù)據(jù)庫的設(shè)置方法及注意事項,因監(jiān)控中用到高權(quán)限的用戶,想像mysql一樣針對這個帳號對IP限制,本文通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-10-10
分享一下SQL Server執(zhí)行動態(tài)SQL的正確方式
這篇文章主要介紹了SQL Server執(zhí)行動態(tài)SQL正確方式,需要的朋友可以參考下2017-06-06
SQL中的UNION ALL和UNION 區(qū)別及如何使用
UNIONALL是SQL中用于合并兩個或多個SELECT查詢結(jié)果集的操作符,其核心特點(diǎn)是保留所有行,下面從語法、使用條件、示例、性能特點(diǎn)及注意事項等方面系統(tǒng)講解 UNION ALL 的使用方法,感興趣的朋友跟隨小編一起看看吧2026-01-01
sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
重復(fù)數(shù)據(jù),通常有兩種:一是完全重復(fù)的記錄,也就是所有字段的值都一樣;二是部分字段值重復(fù)的記錄2013-05-05
SQL?Server日期時間和字符串之間的轉(zhuǎn)換方法實(shí)例
處理原始數(shù)據(jù)時,您可能經(jīng)常會遇到存儲為文本的日期值,將這些值轉(zhuǎn)換為日期數(shù)據(jù)類型非常重要,因?yàn)樵诜治鲞^程中日期可能更有價值,下面這篇文章主要給大家介紹了關(guān)于SQL?Server日期時間和字符串之間的轉(zhuǎn)換方法,需要的朋友可以參考下2023-06-06

