第一部分:語法
位移函數語法如下:
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的數據。