There are three ranking-type analytical functions that deal with just such a problem as this:
The format of an analytical function is this:
function() OVER(<analytic clause>)
where <analytic clause> contains ordering, partitioning, windowing, or some combination.
The ROW_NUMBER function with an ordering on salary in descending order looks like this:
SQL> SQL> drop table emp; Table dropped.-- w ww. j a v a 2 s . com SQL> create table emp( 2 empno Number(3) NOT NULL, 3 ename VARCHAR2(10 BYTE), 4 hireDate DATE, 5 orig_salary Number(8,2), 6 curr_salary Number(8,2), 7 region VARCHAR2(1 BYTE) 8 ); SQL> SQL> insert into emp values(1,'Alison',DATE '1996-03-21', 45000, NULL, 'E'); SQL> insert into emp values(2,'James',DATE '1978-12-12', 23000, 32000, 'W'); SQL> insert into emp values(3,'Celia',DATE '1982-10-24', NULL, 58000, 'E'); SQL> insert into emp values(4,'Robert',DATE '1984-01-15', 31000, NULL, 'W'); SQL> insert into emp values(5,'Linda',DATE '1987-07-30', NULL, 53000, 'E'); SQL> insert into emp values(6,'David',DATE '1990-12-31', 78000, NULL, 'W'); SQL> insert into emp values(7,'Jode',DATE '1996-09-17', 21000, 29000, 'E'); SQL> SQL> SQL> SELECT empno, 2 ename, 3 orig_salary, 4 ROW_NUMBER() OVER(ORDER BY orig_salary desc) toprank 5 FROM emp 6
Analytical functions will generate an ordering by themselves.
The following code includes a final ordering of the result set with an ORDER BY at the end of the query:
SQL> SQL> SELECT empno, 2 ename,-- w w w . j a va 2 s . c om 3 orig_salary, 4 ROW_NUMBER() OVER(ORDER BY orig_salary desc) toprank 5 FROM emp 6 ORDER BY orig_salary desc 7
The final ORDER BY ensures the ordering of the final display.
To illustrate a different ordering with the use of analytical functions:
SQL> SQL> SELECT empno, 2 ename,-- w ww .j a v a 2 s. co m 3 orig_salary, 4 ROW_NUMBER() OVER(ORDER BY orig_salary desc) toprank 5 FROM emp 6 ORDER BY ename 7