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

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

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

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

1.LAG()函數(shù)

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

LAG(Expression, OffSetValue, DefaultVar) OVER (
    PARTITION BY [Expression]
    ORDER BY Expression [ASC|DESC]
);
  • expression??: 你想要獲取的列或表達式。
  • offset?? (可選): 你希望向前偏移的行數(shù)。默認是 1,表示獲取前一行的數(shù)據(jù)。
  • default_value?? (可選): 如果當前行之前沒有足夠的行,返回的默認值。默認是 NULL,如果沒有設(shè)置 default_value,且當前行是窗口的第一行或沒有前幾行數(shù)據(jù)時,返回 NULL。
  • PARTITION BY?? (可選): 按某列分組計算窗口函數(shù),類似于 GROUP BY。如果沒有此項,整個數(shù)據(jù)集視為一個窗口。
  • 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????:帶默認值的LAG()函數(shù)

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

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”值,如果沒有前一行則返回默認值 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() 類似,但它返回的是當前行的后幾行的數(shù)據(jù)。

LEAD(Expression, OffSetValue, DefaultVar) OVER (
    PARTITION BY [Expression]
    ORDER BY Expression [ASC|DESC]
);
  • expression??: 你想要獲取的列或表達式。
  • offset?? (可選): 你希望向前偏移的行數(shù)。默認是 1,表示獲取前一行的數(shù)據(jù)。
  • default_value?? (可選): 如果當前行之前沒有足夠的行,返回的默認值。默認是 NULL,如果沒有設(shè)置 default_value,且當前行是窗口的第一行或沒有前幾行數(shù)據(jù)時,返回 NULL。
  • PARTITION BY?? (可選): 按某列分組計算窗口函數(shù),類似于 GROUP BY。如果沒有此項,整個數(shù)據(jù)集視為一個窗口。
  • 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????:帶默認值的LEAD()函數(shù)

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

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”值,如果沒有后一行則返回默認值 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

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

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

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

思路:

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

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

    • 只選擇當前座位是空閑的 (free = 1)。
    • 選擇那些前一個或后一個座位也是空閑的 (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é)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    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存儲過程語法詳解

    sqlserver存儲過程語法詳解

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

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

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

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

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

    sqlserver 模糊查詢常用方法

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

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

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

    解析如何在sqlserver代理中配置郵件會話

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

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

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

    SQL Server的死鎖說明

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

最新評論

汉寿县| 华坪县| 清水县| 台湾省| 临夏市| 色达县| 灵丘县| 鹰潭市| 深水埗区| 安阳县| 汾西县| 阜宁县| 嘉荫县| 农安县| 凉山| 砚山县| 明星| 三江| 郸城县| 石泉县| 平潭县| 格尔木市| 兰西县| 贵州省| 博兴县| 静乐县| 封丘县| 朝阳市| 阜阳市| 喜德县| 正安县| 安图县| 峨眉山市| 和平县| 当涂县| 灵武市| 鄂州市| 霍山县| 鸡东县| 乡城县| 田阳县|