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

SQL偏移類窗口函數(shù) LAG、LEAD的用法小結(jié)

 更新時(shí)間:2025年08月13日 10:37:46   作者:喻師傅  
在 SQL 中,偏移類窗口函數(shù) LAG() 和 LEAD() 用于訪問當(dāng)前行的前幾行或后幾行的值,下面就來具體介紹一下LAG、LEAD的用法,感興趣的可以了解一下

在 SQL 中,偏移類窗口函數(shù) LAG() 和 LEAD() 用于訪問當(dāng)前行的前幾行或后幾行的值。

1.LAG()函數(shù)

LAG() 函數(shù)返回當(dāng)前行的前幾行的數(shù)據(jù)。

LAG(Expression, OffSetValue, DefaultVar) OVER (
    PARTITION BY [Expression]
    ORDER BY Expression [ASC|DESC]
);
  • expression??: 你想要獲取的列或表達(dá)式。
  • offset?? (可選): 你希望向前偏移的行數(shù)。默認(rèn)是 1,表示獲取前一行的數(shù)據(jù)。
  • default_value?? (可選): 如果當(dāng)前行之前沒有足夠的行,返回的默認(rèn)值。默認(rèn)是 NULL,如果沒有設(shè)置 default_value,且當(dāng)前行是窗口的第一行或沒有前幾行數(shù)據(jù)時(shí),返回 NULL
  • PARTITION BY?? (可選): 按某列分組計(jì)算窗口函數(shù),類似于 GROUP BY。如果沒有此項(xiàng),整個(gè)數(shù)據(jù)集視為一個(gè)窗口。
  • ORDER BY??: 按照某列排序,確定偏移的順序。

Demo????????????:

表格數(shù)據(jù)??

sales 表,表結(jié)構(gòu)和數(shù)據(jù)如下:

idmonthrevenue
1Jan100
2Feb150
3Mar200

Demo????:基礎(chǔ)用法

使用 LAG() 函數(shù)來獲取按月排序后的“revenue”列的前一行的值。

SELECT  id, 
		month, 
		revenue, 
		LAG(revenue) OVER (ORDER BY month) AS prev_revenue
FROM sales;
idmonthrevenueprev_revenue
1Jan100NULL
2Feb150100
3Mar200150

Tips????:

  • 第一行沒有前一行,所以 prev_revenueNULL。
  • 第二行的 prev_revenue 為第一行的 revenue 值(100)。
  • 第三行的 prev_revenue 為第二行的 revenue 值(150)。

Demo????:帶偏移量的LAG()函數(shù)

使用 LAG() 函數(shù),并指定偏移量為 2,獲取兩行之前的“revenue”值。

SELECT  id, 
		month, 
		revenue, 
		LAG(revenue, 2) OVER (ORDER BY month) AS prev_revenue
FROM sales;
idmonthrevenueprev_revenue
1Jan100NULL
2Feb150NULL
3Mar200100

Tips????:

  • 第一行和第二行都沒有兩行之前的記錄,所以 prev_revenueNULL
  • 第三行的 prev_revenue 為第一行的 revenue 值(100)。

Demo????:帶默認(rèn)值的LAG()函數(shù)

使用 LAG() 函數(shù),并指定默認(rèn)值為 0,當(dāng)無法獲取前一行的值時(shí)返回默認(rèn)值。

SELECT  id, 
		month, 
		revenue, 
		LAG(revenue, 1, 0) OVER (ORDER BY month) AS prev_revenue
FROM sales;
idmonthrevenueprev_revenue
1Jan1000
2Feb150100
3Mar200150

Tips????:

  • 使用 LAG(revenue, 1, 0) 來獲取前一行的“revenue”值,如果沒有前一行則返回默認(rèn)值 0。
  • 第一行沒有前一行,所以 prev_revenue 為 0。
  • 第二行的 prev_revenue 為第一行的 revenue 值(100)。
  • 第三行的 prev_revenue 為第二行的 revenue 值(150)。

Demo????:LAG()函數(shù),比較每一天的銷售額與前一天的銷售額的差異。

SELECT
    sale_date,
    amount,
    LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS previous_day_amount,
    amount - LAG(amount, 1, 0) OVER (ORDER BY sale_date) AS difference
FROM sales;
  • LAG(amount, 1, 0):這行的 LAG 函數(shù)表示獲取前一天(前一行)的 amount 列的值,如果前一天沒有數(shù)據(jù)(例如第一行),則返回 0
  • 通過 ORDER BY sale_date,確保按日期順序排列數(shù)據(jù)。
sale_dateamountprevious_day_amountdifference
2025-01-011000100
2025-01-0215010050
2025-01-0320015050
2025-01-04180200-20

2.LEAD()函數(shù)

LEAD() 函數(shù)與 LAG() 類似,但它返回的是當(dāng)前行的后幾行的數(shù)據(jù)。

LEAD(Expression, OffSetValue, DefaultVar) OVER (
    PARTITION BY [Expression]
    ORDER BY Expression [ASC|DESC]
);
  • expression??: 你想要獲取的列或表達(dá)式。
  • offset?? (可選): 你希望向前偏移的行數(shù)。默認(rèn)是 1,表示獲取前一行的數(shù)據(jù)。
  • default_value?? (可選): 如果當(dāng)前行之前沒有足夠的行,返回的默認(rèn)值。默認(rèn)是 NULL,如果沒有設(shè)置 default_value,且當(dāng)前行是窗口的第一行或沒有前幾行數(shù)據(jù)時(shí),返回 NULL。
  • PARTITION BY?? (可選): 按某列分組計(jì)算窗口函數(shù),類似于 GROUP BY。如果沒有此項(xiàng),整個(gè)數(shù)據(jù)集視為一個(gè)窗口。
  • ORDER BY??: 按照某列排序,確定偏移的順序。

Demo????:基礎(chǔ)用法

使用 LEAD() 函數(shù)來獲取按月排序后的“revenue”列的后一行的值。

SELECT  id, 
		month, 
		revenue, 
		LEAD(revenue) OVER (ORDER BY month) AS next_revenue
FROM sales;
idmonthrevenuenext_revenue
1Jan100150
2Feb150200
3Mar200NULL

Tips????:

  • 第一行的 next_revenue 為第二行的 revenue 值(150)。
  • 第二行的 next_revenue 為第三行的 revenue 值(200)。
  • 第三行沒有后續(xù)行,所以 next_revenue 為 NULL。

Demo????:帶偏移量的LEAD()函數(shù)

使用 LEAD() 函數(shù),并指定偏移量為 2,獲取兩行之后的“revenue”值。

SELECT  id, 
		month,
		revenue, 
		LEAD(revenue, 2) OVER (ORDER BY month) AS next_revenue
FROM sales;
idmonthrevenuenext_revenue
1Jan100200
2Feb150NULL
3Mar200NULL

Tips????:

  • 使用 LEAD(revenue, 2) 來獲取兩行之后的“revenue”值。
  • 第一行的 next_revenue 為第三行的 revenue 值(200)。
  • 第二行和第三行都沒有兩行之后的記錄,所以 next_revenue 為 NULL。

Demo????:帶默認(rèn)值的LEAD()函數(shù)

使用 LEAD() 函數(shù),并指定默認(rèn)值為 0,當(dāng)無法獲取后一行的值時(shí)返回默認(rèn)值。

SELECT id, month, revenue, LEAD(revenue, 1, 0) OVER (ORDER BY month) AS next_revenue
FROM sales;
idmonthrevenuenext_revenue
1Jan100150
2Feb150200
3Mar2000

Tips????:

  • 使用 LEAD(revenue, 1, 0) 來獲取后一行的“revenue”值,如果沒有后一行則返回默認(rèn)值 0。
  • 第一行的 next_revenue 為第二行的 revenue 值(150)。
  • 第二行的 next_revenue 為第三行的 revenue 值(200)。
  • 第三行沒有后一行,所以 next_revenue 為 0。

Demo????:LEAD()函數(shù),比較每一天的銷售額與下一天的銷售額的差異。

SELECT
    sale_date,
    amount,
    LEAD(amount, 1, 0) OVER (ORDER BY sale_date) AS next_day_amount,
    LEAD(amount, 1, 0) OVER (ORDER BY sale_date) - amount AS difference
FROM sales;
  • LEAD(amount, 1, 0):這行的 LEAD 函數(shù)表示獲取下一天(下一行)的 amount 列的值。如果下一天沒有數(shù)據(jù)(例如最后一行),則返回 0。
  • 通過 ORDER BY sale_date,確保按日期順序排列數(shù)據(jù)。
sale_dateamountnext_day_amountdifference
2025-01-0110015050
2025-01-0215020050
2025-01-03200180-20
2025-01-041800-180

最后再來一個(gè)小練習(xí)(lc會(huì)員題):查找電影院所有連續(xù)可用的座位。

WITH t1 AS (
    SELECT
        seat_id,  -- 選擇座位ID
        free,  -- 選擇當(dāng)前座位的空閑狀態(tài)
        lag(free, 1, 999) OVER() AS pre,  -- 獲取當(dāng)前座位前一個(gè)座位的空閑狀態(tài),默認(rèn)值為 999
        lead(free, 1, 999) OVER() AS next  -- 獲取當(dāng)前座位后一個(gè)座位的空閑狀態(tài),默認(rèn)值為 999
    FROM Cinema  -- 從 Cinema 表中選擇數(shù)據(jù)
)

SELECT
    seat_id  -- 返回座位ID
FROM t1  -- 從 t1 子查詢中選擇數(shù)據(jù)
WHERE 
    free = 1  -- 當(dāng)前座位為空閑
    AND (pre = 1 OR next = 1)  -- 前一個(gè)座位或后一個(gè)座位為空閑
ORDER BY seat_id;  -- 按座位ID升序排序

思路:

  1. lag(free, 1, 999) 和 lead(free, 1, 999):

    • lag(free, 1, 999) 用于獲取當(dāng)前座位前一個(gè)座位的 free 值(默認(rèn)為 999,表示沒有前一個(gè)座位)。
    • lead(free, 1, 999) 用于獲取當(dāng)前座位后一個(gè)座位的 free 值(默認(rèn)為 999,表示沒有后一個(gè)座位)。
  2. free = 1 和 (pre = 1 OR next = 1):

    • 只選擇當(dāng)前座位是空閑的 (free = 1)。
    • 選擇那些前一個(gè)或后一個(gè)座位也是空閑的 (pre = 1 OR next = 1),表示這些座位是連續(xù)空閑的。
  3. ORDER BY seat_id:

    • 確保最終返回的結(jié)果按座位 ID 升序排序。
seat_idfree
11
20
31
41
51

通過執(zhí)行查詢,得到的 t1 子查詢結(jié)果:

seat_idfreeprenext
119990
2011
3101
4111
511999

從 t1 中篩選出滿足 free = 1 且 (pre = 1 OR next = 1) 的行,得到的結(jié)果:

seat_id
3
4
5

 到此這篇關(guān)于SQL偏移類窗口函數(shù) LAG、LEAD的用法小結(jié)的文章就介紹到這了,更多相關(guān)SQL偏移類窗口函數(shù) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SQL Server中的文件和文件組介紹

    SQL Server中的文件和文件組介紹

    這篇文章介紹了SQL Server中的文件和文件組,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • CMD命令操作MSSQL2005數(shù)據(jù)庫(命令整理)

    CMD命令操作MSSQL2005數(shù)據(jù)庫(命令整理)

    創(chuàng)建數(shù)據(jù)庫、創(chuàng)建用戶、修改數(shù)據(jù)的所有者、設(shè)置READ_COMMITTED_SNAPSHOT以及備份、日志扥等等,感興趣的朋友可以參考下
    2013-05-05
  • sqlserver存儲(chǔ)過程語法詳解

    sqlserver存儲(chǔ)過程語法詳解

    這篇文章主要介紹了sqlserver存儲(chǔ)過程語法示例,需要的朋友可以參考下
    2014-04-04
  • sql多條件多字段排序(圖文教程)

    sql多條件多字段排序(圖文教程)

    sql多條件多字段排序是日常應(yīng)用中比不可少的,本人搜集整理了一些,以供不時(shí)之需,需要了解的朋友可以參考下
    2012-12-12
  • SQL Server數(shù)據(jù)庫的死鎖詳細(xì)說明

    SQL Server數(shù)據(jù)庫的死鎖詳細(xì)說明

    死鎖是指在一組進(jìn)程中的各個(gè)進(jìn)程均占有不會(huì)釋放的資源,但因互相申請被其他進(jìn)程所站用不會(huì)釋放的資源而處于的一種永久等待,下面這篇文章主要給大家介紹了關(guān)于SQL Server死鎖的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • sqlserver 模糊查詢常用方法

    sqlserver 模糊查詢常用方法

    LIKE 關(guān)鍵字搜索與指定模式匹配的字符串、日期或時(shí)間值。LIKE 關(guān)鍵字使用常規(guī)表達(dá)式包含值所要匹配的模式。模式包含要搜索的字符串,字符串中可包含四種通配符的任意組合。
    2010-09-09
  • sqlserver 字段值拼接的實(shí)現(xiàn)示例

    sqlserver 字段值拼接的實(shí)現(xiàn)示例

    拼接字段可以通過多種方法實(shí)現(xiàn),本文主要介紹了sqlserver字段值拼接的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 解析如何在sqlserver代理中配置郵件會(huì)話

    解析如何在sqlserver代理中配置郵件會(huì)話

    本篇文章是對如何在sqlserver代理中配置郵件會(huì)話進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • SQLSERVER 語句交錯(cuò)引發(fā)的死鎖問題案例詳解

    SQLSERVER 語句交錯(cuò)引發(fā)的死鎖問題案例詳解

    這篇文章主要介紹了SQLSERVER 語句交錯(cuò)引發(fā)的死鎖研究,要解決死鎖問題,個(gè)人感覺需要非常熟知各種隔離級(jí)別,尤其是 可提交讀 模式下的 CURD 加解鎖過程,這一篇我們就來好好聊一聊
    2023-02-02
  • SQL Server的死鎖說明

    SQL Server的死鎖說明

    死鎖是導(dǎo)致數(shù)據(jù)庫中的競爭性并發(fā)鎖,通常在多步驟事務(wù)中。當(dāng)兩個(gè)或多個(gè)任務(wù)永久相互阻止時(shí),每個(gè)任務(wù)都鎖定了其他任務(wù)嘗試鎖定的資源,就會(huì)發(fā)生死鎖。本文主要介紹了SQL Server的死鎖,感興趣的朋友可以參考閱讀
    2023-04-04

最新評論

修水县| 仲巴县| 镇雄县| 沂南县| 赤城县| 淮安市| 商河县| 丹江口市| 普陀区| 拜泉县| 井冈山市| 保康县| 通山县| 桂林市| 阿合奇县| 富源县| 兴业县| 余姚市| 社会| 鄂温| 紫金县| 蒙山县| 静海县| 泸西县| 同仁县| 吉木乃县| 楚雄市| 青岛市| 雷波县| 辽宁省| 九龙县| 平遥县| 郴州市| 通州区| 竹溪县| 丁青县| 铜山县| 和平县| 三都| 辰溪县| 从江县|