Difference between ROW_NUMBER(),RANK(),DENSE_RANK
Let us assume, i have a emp table columns ename,sal. The emp table shows below.
ENAME
|
SAL
|
---|---|
SMITH | 800 |
ALLEN | 1600 |
WARD | 1250 |
JONES | 2975 |
MARTIN | 1250 |
BLAKE | 2850 |
CLARK | 2450 |
SCOTT | 3000 |
KING | 5000 |
TURNER | 1500 |
ADAMS | 1100 |
JAMES | 950 |
FORD | 3000 |
MILLER | 1300 |
Query like this.
SELECT ENAME,SAL,ROW_NUMBER() OVER(ORDER BY SAL DESC) ROW_NUMBER, RANK() OVER(ORDER BY SAL DESC)RANK, DENSE_RANK() OVER(ORDER BY SAL DESC) DENSE_RANK FROM EMP
Out putENAME | SAL | ROW_NUMBER | RANK | DENSE_RANK |
---|---|---|---|---|
KING | 5000 | 1 | 1 | 1 |
SCOTT | 3000 | 2 | 2 | 2 |
FORD | 3000 | 3 | 2 | 2 |
JONES | 2975 | 4 | 4 | 3 |
BLAKE | 2850 | 5 | 5 | 4 |
CLARK | 2450 | 6 | 6 | 5 |
ALLEN | 1600 | 7 | 7 | 6 |
TURNER | 1500 | 8 | 8 | 7 |
MILLER | 1300 | 9 | 9 | 8 |
WARD | 1250 | 10 | 10 | 9 |
MARTIN | 1250 | 11 | 10 | 9 |
ADAMS | 1100 | 12 | 12 | 10 |
JAMES | 950 | 13 | 13 | 11 |
SMITH | 800 | 14 | 14 | 12 |
Its all depends on your requirement and business rule you are following.
1. Row_number to be used only when you just want to have serial number on result set. It is not as intelligent as RANK and DENSE_RANK.
2. Choice between RANK and DENSE_RANK depends on business rule you are following. Rank leaves the gaps between number when it sees common values in 2 or more rows. DENSE_RANK don't leave any gaps between ranks.
So while assigning the next rank to the row RANK will consider the total count of rows before that row and DESNE_RANK will just give next rank according to the value.
So If you are selecting employee’s rank according to their salaries you should be using DENSE_RANK and if you are ranking students according to there marks you should be using RANK(Though it is not mandatory, depends on your requirement.)
1. Row_number to be used only when you just want to have serial number on result set. It is not as intelligent as RANK and DENSE_RANK.
2. Choice between RANK and DENSE_RANK depends on business rule you are following. Rank leaves the gaps between number when it sees common values in 2 or more rows. DENSE_RANK don't leave any gaps between ranks.
So while assigning the next rank to the row RANK will consider the total count of rows before that row and DESNE_RANK will just give next rank according to the value.
So If you are selecting employee’s rank according to their salaries you should be using DENSE_RANK and if you are ranking students according to there marks you should be using RANK(Though it is not mandatory, depends on your requirement.)
No comments:
Post a Comment