Oracle, MySQL 分組編號與全排序編號 row_number, over, partition by
留給自己的一 memo,使用 Oracle 匯出資料的時候常常需要加上分組編號,這邊簡單記錄一下使用方法。
使用 ROWNUM 編號 (Oracle)
首先第一種情況是要從頭到尾做連續編號,如果使用 ROWNUM 做的話,會發現只要加了 ORDER BY,序號不會跟著順序重新編號,例如
SELECT rownum, t.* FROM TEST t
如果只是要簡單編號不考慮資料排序 (order by) 直接使用 ROWNUM 即可(下表左),若加上排序後如下表右,順序並不會跟著變動。
1 | B000636 | 無 |
2 | B000637 | 無 |
3 | F00001 | 原始 |
4 | F00001 | 分類 |
5 | F00002 | 原始 |
6 | F00003 | 分類 |
6 | F00003 | 分類 |
5 | F00002 | 原始 |
4 | F00001 | 原始 |
3 | F00001 | 分類 |
2 | B000637 | 無 |
1 | B000636 | 無 |
使用 row_number(), over() 全排序編號
這種時候借助 row_number() 與 over() 的幫忙就可以完成
SELECT row_number() over (order by no desc) seq, t.* FROM TEST t
1 | F00003 | 分類 |
2 | F00002 | 原始 |
3 | F00001 | 原始 |
4 | F00001 | 分類 |
5 | B000637 | 無 |
6 | B000636 | 無 |
使用 row_number(), over(partition by) 做 Oracle 分組編號
還有一種常見的需求是做分組編號,就是遇到同類型的時候,可以標註這是該類型的編號幾,只要在 over 中加入 partition by 要用來當作分組依據的欄位即可
SELECT t.no, row_number() over (partition by t.no order by t.no asc) seq, t.type FROM TEST t
B000636 | 1 | 無 |
B000637 | 1 | 無 |
F00001 | 1 | 原始 |
F00001 | 2 | 分類 |
F00002 | 1 | 原始 |
F00003 | 1 | 分類 |
類似需求備忘:Oracle rownum / row_number / rank / dense_rank 這四個的差異
延伸閱讀:
MariaDB JSON_EXTRACT: 從 JSON 欄位取值