SQL Server這兩個高級函數的用法,你學會了嗎?
SQL Server從2012版本開始,引入了LEAD和LAG函數,這兩個函數可以把之前要關聯查詢的方法,改為可直接獲取當前數據上下相鄰多少行數據,可以很方便的對上下相鄰兩行的數據進行加減乘除。今天我們就給大家介紹一下這兩個函數的用法。
LAG函數
LAG的作用
LAG 以當前行之前的給定物理偏移量來提供對行的訪問。 在 SELECT 語句中使用此分析函數可將當前行中的值與先前行中的值進行比較。
LAG的語法
LAG (scalar_expression [,offset] [,default]) OVER ( [ partition_by_clause ] order_by_clause )
參數解釋
scalar_expression
要根據指定偏移量返回的值。 這是一個返回單個(標量)值的任何類型的表達式。scalar_expression 不能為分析函數。
offset
當前行(從中獲得取值)后的行數。 如果未指定,則默認值為 1。
OVER
為開窗函數,LAG函數必須與開窗函數一起使用。
LAG示例
- WITH T AS
- (
- SELECT 1 ID,10 NUM
- UNION ALL
- SELECT 1,20
- UNION ALL
- SELECT 1,30
- UNION ALL
- SELECT 2,40
- UNION ALL
- SELECT 2,50
- UNION ALL
- SELECT 2,60
- )
- SELECT ID,NUM,
- LAG(NUM) OVER (PARTITION BY ID ORDER BY NUM) AS OneArgs,
- LAG(NUM,1) OVER (PARTITION BY ID ORDER BY NUM) AS TowArgs,
- LAG(NUM,2,0) OVER (PARTITION BY ID ORDER BY NUM) AS ThressArgs
- FROM T
(提示:可以左右移動代碼)
結果如下:
從上面的示例中我們可以看到
1、針對列OneArgs,組內的NUM列的值默認向后偏移了一行,每組的第一行用默認的NULL來代替
2、針對TowArgs,使用了2個參數顯示的偏移行,NUM的值也是向后偏移一行。
3、針對ThreeArgs,不僅使用了顯示的偏移2行,而且第三個參數將偏移后默認值NULL改成了0
實戰例子:如何求解組內上下兩行的和?
- SELECT ID,NUM,
- NUM+LAG(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM) AS Result
- FROM T
結果如下:
注意:第一行因為默認是0,所以每組第一行的結果是NUM+0=NUM
LEAD函數
LEAD函數與LAG函數剛剛相反,它是向前偏移指定的行數,默認是1行。
語法哈參數與LAG類似,這里就不重復介紹了。我們直接看示例:
- SELECT ID,NUM,
- LEAD(NUM) OVER (PARTITION BY ID ORDER BY NUM) AS OneArgs,
- LEAD(NUM,1) OVER (PARTITION BY ID ORDER BY NUM) AS TowArgs,
- LEAD(NUM,2,0) OVER (PARTITION BY ID ORDER BY NUM) AS ThressArgs
- FROM T
結果:
使用情況與LAG函數類似,只是組內數據分別向前偏移了指定行數。
實戰示例:求解同組內上下兩行的差?
- SELECT ID,NUM,
- LEAD(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM)-NUM AS Result
- FROM T
結果:
每組最后一行默認是0,所以0-NUM=-NUM
以上就是這兩個函數的相關用法。