close
ROW_NUMBER 的簡介與範例ROW_NUMBER,顧名思義可以知道這個 function 可以為查出來的每一筆記錄依序塞入一個順序值(1、2、3、…),感覺上好像跟 oracle 的 ROWNUM 一樣,但是這個 function 厲害的地方在於它可以指定某個欄位來排順序值。舉例來說:公司裏有 A、B 兩個部門,A 部門裏有三個員工,而 B 部門裏有六個員工,若想要分別為 A 部門和 B 部門排順序值,使用 ROWNUM 是做不到的,此時只能使用 ROW_NUMBER。
 
ROW_NUMBER 的使用格式如下:
   
ROW_NUMBER() OVER (PARTITION BY partition欄位 ORDER BY 排序欄位)
 
其中「PARTITION BY partition 欄位」是選填的,若不填的話整個 ROW_NUMBER() 的效果就幾乎跟 ROWNUM 一樣,也就是不分類別對查出來的欄位從 1 開始依序塞入一個順序值。
 
而「ORDER BY 排序欄位」為必填欄位,這個指令用來指出要依那個欄位做排序之後在塞入順序值,請注意,此處的 ORDER BY 只是塞順序值的依據,查出來的資料未必會照這個順序呈現,若呈現資料時想要照指定的欄位排序,還是要在 select 指令下 ORDER BY。
 
舉個例子來說,若資料為:
部門 員工編號
A 001
A 005
A 007
B 002
B 004
B 006
B 003
B 009
B 008

 
則第一種情況,不指定 Partition 欄位
    SELECT 部門, 員工編號, 
           ROW_NUMBER() OVER (ORDER BY 員工編號) as 順序 
    FROM 公司
   
則查出來的結果為:
部門 員工編號 順序
A 001 1
A 005 5
A 007 7
B 002 2
B 004 4
B 006 6
B 003 3
B 009 9
B 008 8

 
若指定 Partition 欄位,
    SELECT 部門, 員工編號, 
           ROW_NUMBER() OVER (PARTITION BY 部門 ORDER BY 員工編號) as 順序 
    FROM 公司
 
則查出的結果為:
部門 員工編號 順序
A 001 1
A 005 2
A 007 3
B 002 1
B 004 3
B 006 4
B 003 2
B 009 6
B 008 5

 
最後要注意的一點是 ROW_NUMBER 並不能直接拿來當 where 條件,如果有需要使用 ROW_NUMBER 得出的值來當 where 條件的話,必需用子查詢方可,如下所示:
    SELECT * 
    FROM (
      SELECT 部門, 員工編號, 
            ROW_NUMBER() OVER (PARTITION BY 部門 ORDER BY 員工編號) as順序
      FROM 公司)
    WHERE 順序 = 1
 
查出的結果為:
部門 員工編碼 順序
A 001 1
B 002 1
arrow
arrow
    全站熱搜

    大笨鳥 發表在 痞客邦 留言(1) 人氣()