1.row_number() 的使用
原表資訊:
SQL> break on deptno skip 1 -- 爲效果更明顯,把不同部門的資料隔段顯示。
SQL> select deptno,ename,sal
2 from emp
3 order by deptno,sal desc;
DEPTNO ENAME SAL
---------- ---------- ----------
10 KING 5000
CLARK 2450
MILLER 1300
20 SCOTT 3000
FORD 3000
JONES 2975
ADAMS 1100
SMITH 800
30 BLAKE 2850
ALLEN 1600
TURNER 1500
WARD 1250
MARTIN 1250
JAMES 950
已選擇 14行。
使用 row_number()查出各部門薪水最高的三個員工姓名、薪水,多於三個的只取三個。
SQL> select * from (
2 select deptno,row_number() over(partition by deptno order by sal desc) rw,ename,sal
3 from emp
4 )
5 where rw<=3;
DEPTNO RW ENAME SAL
---------- ---------- ---------- ----------
10 1 KING 5000
2 CLARK 2450
3 MILLER 1300
20 1 SCOTT 3000
2 FORD 3000
3 JONES 2975
30 1 BLAKE 2850
2 ALLEN 1600
3 TURNER 1500
已選擇 9行。
體會: row_number() 返回的主要是“行”的資訊,並沒有按照sal排名,如
20 1 SCOTT 3000
2 FORD 3000
scott與ford薪水一樣多,ford前面的2僅僅是行數、記錄條數的感念。
原表資訊:
SQL> break on deptno skip 1 -- 爲效果更明顯,把不同部門的資料隔段顯示。
SQL> select deptno,ename,sal
2 from emp
3 order by deptno,sal desc;
DEPTNO ENAME SAL
---------- ---------- ----------
10 KING 5000
CLARK 2450
MILLER 1300
20 SCOTT 3000
FORD 3000
JONES 2975
ADAMS 1100
SMITH 800
30 BLAKE 2850
ALLEN 1600
TURNER 1500
WARD 1250
MARTIN 1250
JAMES 950
已選擇 14行。
使用 row_number()查出各部門薪水最高的三個員工姓名、薪水,多於三個的只取三個。
SQL> select * from (
2 select deptno,row_number() over(partition by deptno order by sal desc) rw,ename,sal
3 from emp
4 )
5 where rw<=3;
DEPTNO RW ENAME SAL
---------- ---------- ---------- ----------
10 1 KING 5000
2 CLARK 2450
3 MILLER 1300
20 1 SCOTT 3000
2 FORD 3000
3 JONES 2975
30 1 BLAKE 2850
2 ALLEN 1600
3 TURNER 1500
已選擇 9行。
體會: row_number() 返回的主要是“行”的資訊,並沒有按照sal排名,如
20 1 SCOTT 3000
2 FORD 3000
scott與ford薪水一樣多,ford前面的2僅僅是行數、記錄條數的感念。