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欄位
則第一種情況,不指定 Partition 欄位
SELECT 部門, 員工編號,
ROW_NUMBER() OVER (ORDER BY 員工編號) as 順序
FROM 公司
則查出來的結果為:
若指定 Partition 欄位,
SELECT 部門, 員工編號,
ROW_NUMBER() OVER (PARTITION BY 部門 ORDER BY 員工編號) as 順序
FROM 公司
則查出的結果為:
最後要注意的一點是 ROW_NUMBER 並不能直接拿來當 where 條件,如果有需要使用 ROW_NUMBER 得出的值來當 where 條件的話,必需用子查詢方可,如下所示:
SELECT *
FROM (
SELECT 部門, 員工編號,
ROW_NUMBER() OVER (PARTITION BY 部門 ORDER BY 員工編號) as順序
FROM 公司)
WHERE 順序 = 1
查出的結果為:
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 |
全站熱搜