最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL中Lag()和LEAD()的用法示例詳解

 更新時間:2025年10月28日 09:28:56   作者:王旭亮_  
LAG和LEAD函數(shù)為SQL開發(fā)者提供了強大的數(shù)據(jù)洞察力,尤其是在處理時間序列和趨勢分析問題時,下面這篇文章主要介紹了SQL中Lag()和LEAD()用法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

LAG() 和 LEAD() 是 SQL 中常用的窗口函數(shù),核心作用是在同一結(jié)果集中,根據(jù)指定排序規(guī)則,獲取當(dāng)前行“前面”或“后面”某行的數(shù)據(jù),無需進行自連接,極大簡化了“跨行取值”的邏輯。

一、核心定義與語法

兩者語法結(jié)構(gòu)完全一致,僅功能相反(LAG 取前,LEAD 取后)。

基本語法

LAG(目標字段, 偏移量, 默認值) OVER (

    PARTITION BY 分組字段  -- 可選:按某字段分組,組內(nèi)獨立計算

    ORDER BY 排序字段 [ASC/DESC]  -- 必須:定義“前后”的排序規(guī)則

) AS 別名

LEAD(目標字段, 偏移量, 默認值) OVER (

    PARTITION BY 分組字段  -- 可選

    ORDER BY 排序字段 [ASC/DESC]  -- 必須

) AS 別名

參數(shù)說明

參數(shù)

作用

目標字段

要獲取的“前/后行”的字段(如金額、日期、姓名等)

偏移量

可選,默認值為 1,表示“前 1 行”(LAG)或“后 1 行”(LEAD

默認值

可選,當(dāng)“前/后行不存在”時返回的值(如第一行用 LAG(1) 會返回 NULL

PARTITION BY

可選,按指定字段分組,組內(nèi)單獨計算“前后行”(如按部門分組取員工數(shù)據(jù))

ORDER BY

必須,定義組內(nèi)數(shù)據(jù)的排序順序,決定“前”和“后”的方向

二、典型應(yīng)用場景(附示例)

假設(shè)存在表 sales,存儲每日銷售數(shù)據(jù),結(jié)構(gòu)如下:

date

product

amount

2024-01-01

A

100

2024-01-02

A

150

2024-01-03

A

200

2024-01-01

B

80

2024-01-02

B

120

場景 1:獲取“上一行/下一行”數(shù)據(jù)(基礎(chǔ)用法)

需求:查詢每個產(chǎn)品的每日銷售額,并顯示“前一天銷售額”和“后一天銷售額”。

SELECT
    date,
    product,
    amount,
    -- 獲取“同一產(chǎn)品”前 1 天的銷售額,無則返回 0
    LAG(amount, 1, 0) OVER (
        PARTITION BY product  -- 按產(chǎn)品分組(不同產(chǎn)品不互相影響)
        ORDER BY date ASC     -- 按日期升序,“前”即“前一天”
    ) AS prev_day_amount,
    -- 獲取“同一產(chǎn)品”后 1 天的銷售額,無則返回 0
    LEAD(amount, 1, 0) OVER (
        PARTITION BY product
        ORDER BY date ASC     -- 按日期升序,“后”即“后一天”
    ) AS next_day_amount
FROM sales;

結(jié)果(清晰看到每行與前后行的關(guān)聯(lián)):

date

product

amount

prev_day_amount

next_day_amount

2024-01-01

A

100

0

150

2024-01-02

A

150

100

200

2024-01-03

A

200

150

0

2024-01-01

B

80

0

120

2024-01-02

B

120

80

0

場景 2:計算“相鄰行差值”(如日環(huán)比)

需求:按產(chǎn)品計算每日銷售額的“環(huán)比增長額”(當(dāng)日銷售額 - 前一日銷售額)。

SELECT
    date,
    product,
    amount,
    -- 當(dāng)日金額 - 前一天金額 = 環(huán)比增長額
    amount - LAG(amount, 1, 0) OVER (
        PARTITION BY product
        ORDER BY date ASC
    ) AS day_on_day_growth
FROM sales;

結(jié)果

date

product

amount

day_on_day_growth

2024-01-01

A

100

100

2024-01-02

A

150

50

2024-01-03

A

200

50

2024-01-01

B

80

80

2024-01-02

B

120

40

場景 3:獲取“間隔多行”的數(shù)據(jù)(自定義偏移量)

需求:查詢每個產(chǎn)品的銷售額,并顯示“前 2 天”的銷售額(偏移量設(shè)為 2)。

SELECT
    date,
    product,
    amount,
    -- 偏移量=2:取“前 2 天”的數(shù)據(jù),無則返回 NULL
    LAG(amount, 2) OVER (
        PARTITION BY product
        ORDER BY date ASC
    ) AS prev_2day_amount
FROM sales;

結(jié)果(2024-01-03 的 A 產(chǎn)品,前 2 天是 2024-01-01 的 100):

date

product

amount

prev_2day_amount

2024-01-01

A

100

NULL

2024-01-02

A

150

NULL

2024-01-03

A

200

100

2024-01-01

B

80

NULL

2024-01-02

B

120

NULL

三、關(guān)鍵注意事項

ORDER BY 必須存在LAG/LEAD 依賴排序規(guī)則定義“前后”,缺少 ORDER BY 會報錯或結(jié)果混亂。

PARTITION BY 分組隔離:無 PARTITION BY 時,全表視為一個“組”,跨行取值會跨越所有數(shù)據(jù)(如產(chǎn)品 A 和 B 的數(shù)據(jù)會互相取前后行)。

偏移量與默認值:偏移量必須為非負整數(shù);默認值不指定時,“前后行不存在”會返回 NULL(可根據(jù)需求設(shè)為 0 或其他值)。

與自連接的區(qū)別:傳統(tǒng)“跨行取值”需用自連接(如 a.date = b.date + 1),但 LAG/LEAD 代碼更簡潔、性能更高(尤其大數(shù)據(jù)量場景)。

總結(jié)

LAG() 和 LEAD() 是“跨行數(shù)據(jù)關(guān)聯(lián)”的高效工具,核心用于:

計算環(huán)比、同比(相鄰時間數(shù)據(jù)對比)

補全缺失的前后關(guān)聯(lián)信息(如前/后訂單、前/后員工數(shù)據(jù))

簡化復(fù)雜的行與行之間的邏輯對比

核心邏輯:按分組、定排序、取前后,即可靈活應(yīng)對各類“跨行取值”需求。

到此這篇關(guān)于SQL中Lag()和LEAD()用法的文章就介紹到這了,更多相關(guān)SQL中Lag()和LEAD()用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL主從庫不同步故障一例解決方法

    MYSQL主從庫不同步故障一例解決方法

    第一次做完主從庫同步后正常,但工作過程中發(fā)現(xiàn)有一個庫的數(shù)據(jù)庫沒有同步起來,在另外一個mysql(3307)中
    2010-06-06
  • mysql 5.7.14 安裝配置方法圖文詳細教程

    mysql 5.7.14 安裝配置方法圖文詳細教程

    這篇文章主要為大家分享了mysql 5.7.14安裝配置方法圖文教程,詳細介紹了mysql 5.7.14安裝可能遇到的一系列問題,感興趣的朋友可以參考一下
    2016-08-08
  • 從MySQL的源碼剖析Innodb buffer的命中率計算

    從MySQL的源碼剖析Innodb buffer的命中率計算

    這篇文章主要介紹了從MySQL的源碼剖析Innodb buffer的命中率計算,作者結(jié)合C語言寫的算法來分析innodb buffer hit Ratios,需要的朋友可以參考下
    2015-05-05
  • MySQL數(shù)據(jù)查看SELECT條件大于?小于(小白入門篇)

    MySQL數(shù)據(jù)查看SELECT條件大于?小于(小白入門篇)

    這篇文章主要為大家介紹了MySQL數(shù)據(jù)查看SELECT條件大于和小于的語句學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • MySQL之范式的使用詳解

    MySQL之范式的使用詳解

    這篇文章主要介紹了MySQL之范式的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • MySQL約束類型及舉例介紹

    MySQL約束類型及舉例介紹

    今天小編就為大家分享一篇關(guān)于MySQL約束類型及介紹的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • MySQL 使用SQL語句修改表名的實現(xiàn)

    MySQL 使用SQL語句修改表名的實現(xiàn)

    這篇文章主要介紹了MySQL 使用SQL語句修改表名的實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • MySQL索引用法實戰(zhàn)指南

    MySQL索引用法實戰(zhàn)指南

    本文詳細介紹了MySQL索引的使用方法,包括索引的原理、類型、設(shè)計原則、優(yōu)化技巧以及常見問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-03-03
  • 你需要理解的關(guān)于MySQL的鎖知識

    你需要理解的關(guān)于MySQL的鎖知識

    鎖是MySQL里面最難理解的知識,但是又無處不在。一開始接觸鎖的時候,感覺被各種鎖類型和名詞弄得暈頭轉(zhuǎn)向,下面小編來簡單介紹一下
    2019-05-05
  • mysql 連接出現(xiàn)Public Key Retrieval is not allowed的問題解決

    mysql 連接出現(xiàn)Public Key Retrieval is n

    在MySQL連接中出現(xiàn)“Public Key Retrieval is not allowed”錯誤,通常是因為在使用安全套接字層(SSL)連接時遇到了問題,本文就來介紹一下解決方法,感興趣的可以了解一下
    2024-03-03

最新評論

安康市| 天台县| 巫溪县| 长顺县| 栾城县| 舟曲县| 葵青区| 阆中市| 磐安县| 黔江区| 抚远县| 连南| 神农架林区| 隆安县| 波密县| 临洮县| 辽阳县| 临邑县| 晋江市| 清镇市| 新晃| 密云县| 汾阳市| 东丰县| 克什克腾旗| 社旗县| 岳阳市| 从化市| 修水县| 伊金霍洛旗| 汨罗市| 佳木斯市| 南京市| 汽车| 定结县| 大埔县| 巢湖市| 麦盖提县| 邹城市| 水城县| 五常市|