介紹關於MSSQL當前行中獲取到上一行某列值的函式 Coalesce
阿新 • • 發佈:2022-04-15
記錄一個小知識點,在SQLGrid中,在當前行顯示上一行某列值的函式** Coalesce **的使用。
顯示上一行是有啥子用?
經常有人百度SQL上一行減下一行的寫法,但是沒幾個文章是用最簡單直接的方法來使用的,一堆union、零時表啊啥子的,SQL有很好使的自帶函式來搞定這個,來看看吧!
比如你有下面的一串資料
時間(CollectTime) | 讀數(Value) |
---|---|
2022-04-14 22:05:07.000 | 259 |
2022-04-13 22:05:07.000 | 258 |
2022-04-12 22:05:07.000 | 257 |
2022-04-11 22:05:07.000 | 256 |
2022-04-10 22:05:07.000 | 255 |
2022-04-09 22:05:07.000 | 254 |
此時的SQL可能是這樣的
SELECT CollectTime,Value FROM DinData
現在你有一個分析場景,需要計算每次讀數的間隔值,這個時候你要是能形成下面的Grid資料,那計算這個值就是個減法了。
時間(CollectTime) | 讀數(Value) | 上次讀數(LastValue) |
---|---|---|
2022-04-14 22:05:07.000 | 259 | 258 |
2022-04-13 22:05:07.000 | 258 | 257 |
2022-04-12 22:05:07.000 | 257 | 256 |
2022-04-11 22:05:07.000 | 256 | 255 |
2022-04-10 22:05:07.000 | 255 | 254 |
2022-04-09 22:05:07.000 | 254 | 253 |
Coalesce 函式就可以幹這個事!
下面的這個SQL怎麼寫呢?
Coalesce 格式是這樣的
Coalesce(lag(Value) over(ORDER BY,CollectTime),Value)
總結就是:做下排序,定下上下行怎麼取的順序,設定下要展示的是上下行中的那個欄位
最後的SQL:
SELECT CollectTime,Value,Coalesce(lag(Value) over(ORDER BY,CollectTime),Value) AS LastValue FROM DinData
此時就可以計算 差值啊之類的了
時間(CollectTime) | 讀數(Value) | 上次讀數(LastValue) | 差值(DinValue) |
---|---|---|---|
2022-04-14 22:05:07.000 | 259 | 258 | 1 |
2022-04-13 22:05:07.000 | 258 | 257 | 1 |
2022-04-12 22:05:07.000 | 257 | 256 | 1 |
2022-04-11 22:05:07.000 | 256 | 255 | 1 |
2022-04-10 22:05:07.000 | 255 | 254 | 1 |
2022-04-09 22:05:07.000 | 254 | 253 | 1 |