函數語法: ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)oracle
函數做用:從1開始,爲按組排序的每條記錄添加一個序列號 函數只能用於select和order by子句中 不能用在where子句函數
不分組排序排序
不進行分組時語法爲ROW_NUMBER() OVER(ORDER BY COLUMN),如:it
有一個表A就一個字段num,數據以下io
numselect
10語法
20數據
30查詢
查詢語句爲select row_number() over(order by num) as idx,num from A
結果以下
num idx
10 1
20 2
30 3
分組排序
分組的話ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2)表示根據COL1分組,在分組內部根據COL2排序,
而此函數的結果值就表示每組內部排序後的順序編號(組內連續的唯一的)
表employee有數據以下
empid deptid salary
1 10 5500.00
2 10 4500.00
3 20 1900.00
4 20 4800.00
查詢語句爲:select *,row_number() over(partition by deptid order by salary desc) rank from employee
結果以下
empid deptid salary rank
1 10 5500.00 1
2 10 4500.00 2
4 20 4800.00 1
3 20 1900.00 2
比較
能夠看到這個函數不分組時的做用oracle自帶row_num也能完成,差異就是row_num從0開始。分組排序這個功能就比較強大
另外還有兩個相似函數rank() over() 和dense_rank() over()
區別就是若是排序字段有重複值
row_number()函數仍是1 2 3排下去
rank() over()則會出現 1 1 3
dense_rank() over() 則會出現 1 1 2
這三種狀況 就是給的序號不同