RANK ():- RANK returns ranking (order) of rows based on the number or expression given in the ORDER BY clause.
ROW_NUMBER ():- It returns the sequential number of the row within a group, starting with 1 based on the ORDER BY clause.
We will see the difference between these 2 functions based on an example:
EMPID
|
ENAME
|
SALARY
|
DEPT_ID
|
RNK
|
ROWNUM
|
1
|
MATT
|
1000
|
10
|
1
|
1
|
4
|
SHANE
|
1000
|
12
|
1
|
2
|
2
|
SCOTT
|
2000
|
10
|
3
|
3
|
7
|
MARY
|
2000
|
10
|
3
|
4
|
3
|
JEAN
|
2000
|
10
|
3
|
5
|
5
|
DEAN
|
4000
|
10
|
6
|
6
|
6
|
LISA
|
4000
|
10
|
6
|
7
|
Now, in a practical scenario, we are required to find the all the employees having Nth highest salary.
In such cases, we can use the below query:
SELECT
E1
.EMPID
,
E1.ENAME
,
E1.SALARY
,
E1.DEPT_ID
,
RANK() OVER(ORDER BY E1.SALARY ASC) AS RNK
,
ROW_NUMBER() OVER(ORDER BY E1.SALARY ASC) AS ROWNUM
FROM
TL_62917_DLY1_QRMDB
.EMP1 AS E1
WHERE
(
E1.SALARY =
SELECT
SAL2.SALARY FROM
(
SELECT
SAL1.SALARY,SAL1.RNK FROM
(
SELECT
SALARY,RANK() OVER(ORDER BY SALARY DESC) RNK FROM TL_62917_DLY1_QRMDB.EMP1
GROUP
BY 1
)
SAL1
WHERE
SAL1.RNK= ?RNK
)
SAL2
)
Output for a value of ?RNK =2 will be:
EMPID
|
ENAME
|
SALARY
|
DEPT_ID
|
RNK
|
ROWNUM
|
3
|
JEAN
|
2000
|
10
|
1
|
1
|
2
|
SCOTT
|
2000
|
10
|
1
|
2
|
7
|
MARY
|
2000
|
10
|
1
|
3
|
This query will return Nth salary even if duplicate values are present in the Salary column.
If you look at the above table, 2000 is the 2nd highest salary.
No comments:
Post a Comment
Please share your thoughts and let us know the topics you want covered