sql開窗函數_位移函數lag與lead


第一部分:語法

位移函數語法如下:

lag(exp_str,offset,defval) over(partition by ..order by …)

lead(exp_str,offset,defval) over(partition by ..order by …)

其中exp_str是字段名

     Offset是偏移量,即是上1個或上N個的值,假設當前行在表中排在第5行,則offset 為3,則表示我們所要找的數據行就是表中的第2行(即5-3=2)。

     Defval默認值,當兩個函數取上N/下N個值,當在表中從當前行位置向前數N行已經超出了表的范圍時,lag()函數將defval這個參數值作為函數的返回值,若沒有指定默認值,則返回NULL,那么在數學運算中,總要給一個默認值才不會出錯。

第二部分:實例

以下語句在以下環境均可以執行:sqlserver2014。

場景:幾個朋友來到電影院的售票處,准備預約連續空余座位。你能利用表 T0527,幫他們寫一個查詢語句,獲取所有空余座位,並將它們按照 seat_id 排序后返回嗎?

示例數據:

對於如上樣例,你的查詢語句應該返回如下結果。 

注意:seat_id 字段是一個自增的整數,free 字段是布爾類型('1' 表示空余, '0' 表示已被占據)。連續空余座位的定義是大於等於 2 個連續空余的座位。

示例數據sql: 

CREATE TABLE T0527
(
seat_id INT,
free INT
)

INSERT INTO T0527 VALUES 
(1,1),
(2,0),
(3,1),
(4,1),
(5,1)

查詢sql: 

SELECT 
SEAT_ID
FROM 
    (SELECT *,    
    LAG(FREE,1,0)OVER(ORDER BY SEAT_ID) AS LAG_FREE,    
    LEAD(FREE,1,0)OVER(ORDER BY SEAT_ID) AS LEAD_FREE    
    FROM T0527    
    )T
WHERE FREE = 1 AND (FREE = LAG_FREE OR FREE = LEAD_FREE)

思路解析:

連續空余座位,那么就是這一行的數據為1並且等於上一行或下一行的數據。

使用位移函數先得到如下結果:

LAG_FREE表示前一行的free數據,LEAD_FREE表示下一行的free數據。此時可以在同一行判斷free是否和LAG_FREE和LEAD_FREE相等,同時要過濾掉free為0的數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM