根據上一行填充本行的空白字段,SQL處理方式

2021-09-23 21:08:49 字數 2299 閱讀 8036

我在4年多前,寫了一篇excel處理空白cell的文章,其實在資料庫中也會遇到這種情況。對於普通的oltp系統來說,應該不會出現,主要是在做olap,匯入外部資料來源時,可能匯入系統的就是帶有空白記錄的資料。

為了方便說明,我舉了乙個簡單的例子,假設乙個學生成績表,有欄位「學生id」和「成績」,學生id是主鍵,自增,成績只有null和1,2,3,4,5這幾個值。在錄入學生成績的時候,如果成績為null,就表示該學生成績和上乙個學生的成績相同。現在要查詢某個學生id的成績,該怎麼查呢?或者要將成績字段改為不允許為空,怎麼把所有null的行填上成績呢?

首先我們先建立示例表:

從結果我們可以看到如果要查詢學生6的成績,那麼應該先去查學生5的成績,由於學生5也是空,所以要繼續查前乙個學生4的成績,得到分數3,所以學生6的成績是3.這顯然是乙個遞迴問題,如果一直是空,會繼續遞迴下去,直到找到乙個成績為止。要在sql中使用遞迴,那麼第乙個應該想到的就是公用表表示式cte。關於cte的語法和說明可以看msdn:

那麼我們這裡遞迴的終點是什麼呢?是不為空的成績,遞迴的鏈結條件是上乙個學生id=當前學生id-1.於是我們可以將此次的公用表表示式寫為:

with t

2as3 (

4select

*from t1 

where score 

isnotnull

5union

all6

select t1.id,t.score

7from t

8inner

join t1

9on t.id

+1=t1.id

10where t1.score 

isnull

11 )

12select*13

from t

14order

by id;

得到的結果為:

這裡的情況比較特殊id是連續的,那麼如果id不連續會怎麼樣呢?我們試著刪除id=5

delete from t1 where id=5

這個時候如果還是執行上面的cte就會查不到id=6的記錄,因為inner join的條件不成立了。那麼簡單的辦法就是使用開窗函式給每一行資料增加一列連續自增的列,sql server中的函式是row_number().這樣就變成了兩個cte巢狀使用,請看**:

公用表表示式真的很強大,另外在使用view出report的時候,也可以用cte,因為在view中不能用臨時表,所以使用cte代替臨時表是個不錯的解決方案。

當本行為空時遞迴取上一行的值

example workbook wb readexcel filename 獲得excel檔案物件workbook sheet s wb.getsheetat 0 獲取指定工作表 這裡獲取的是第乙個 row row s.getrow i 取出第i行 getrow index 獲取第 index 1...

sed刪除匹配行的上一行和下一行

aa string 變數指定匹配字串 sed i e aa e n n.aa p d file 例子 insert into bonusreturnorder values 47 224 1300573 2 1 wx20160203083601539373 hbtk20160204020000110...

網頁頭部多一行空白行的解決辦法

最近使用phpcms做東西的時候,其它地方都好好的,只有但是網頁的頂部卻有一空行,導致其它的樣式顯示有一些異常!檢視了源 發現head頭里的一些meta資訊包括一些js,css引入都跑到body裡,我看了模板,模板裡的倒是正常。一直糾結了我好長時間,後來有一次,使用editplus開啟檔案另存的時候...