這兩個SQL高級函數,你用過嗎?

SQL Server從2012版本開始,引入了LEAD和LAG函數,這兩個函數能夠把以前要關聯查詢的方法,改成可直接獲取當前數據上下相鄰多少行數據,能夠很方便的對上下相鄰兩行的數據進行加減乘除。今天咱們就給你們介紹一下這兩個函數的用法。express

LAG函數ide

LAG的做用
LAG 以當前行以前的給定物理偏移量來提供對行的訪問。 在 SELECT 語句中使用此分析函數可將當前行中的值與先前行中的值進行比較。函數

LAG的語法
LAG (scalar_expression [,offset] [,default]) OVER ( [ partition_by_clause ] order_by_clause )
參數解釋
scalar_expression
要根據指定偏移量返回的值。 這是一個返回單個(標量)值的任何類型的表達式。scalar_expression 不能爲分析函數。
offset
當前行(從中得到取值)後的行數。 若是未指定,則默認值爲 1。
OVER
爲開窗函數,LAG函數必須與開窗函數一塊兒使用。scala

LAG示例code

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

(提示:能夠左右移動代碼)blog

結果以下:it

這兩個SQL高級函數,你用過嗎?

從上面的示例中咱們能夠看到io

一、針對列OneArgs,組內的NUM列的值默認向後偏移了一行,每組的第一行用默認的NULL來代替class

二、針對TowArgs,使用了2個參數顯示的偏移行,NUM的值也是向後偏移一行。語法

三、針對ThreeArgs,不只使用了顯示的偏移2行,並且第三個參數將偏移後默認值NULL改爲了0

實戰例子:如何求解組內上下兩行的和?

SELECT ID,NUM,
NUM+LAG(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM) AS Result
FROM T

結果以下:

這兩個SQL高級函數,你用過嗎?

注意:第一行由於默認是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

結果:

這兩個SQL高級函數,你用過嗎?

使用狀況與LAG函數相似,只是組內數據分別向前偏移了指定行數。

實戰示例:求解同組內上下兩行的差?

SELECT ID,NUM,
LEAD(NUM,1,0) OVER (PARTITION BY ID ORDER BY NUM)-NUM AS Result
FROM T

結果:

這兩個SQL高級函數,你用過嗎?

每組最後一行默認是0,因此0-NUM=-NUM

以上就是這兩個函數的相關用法。

相關文章
相關標籤/搜索