Second maximum value using dense rank function
I have a table like:
name marks
raja 88
ravi 88
karthik 99
praveen 99
vijay 70
In this table, I am assuming the rank of the table is:
name marks rank
karthirk 99 1
praveen 99 2
raja 88 3
ravi 88 4
vijay 77 5
I get this with a function dense rank()
:
select name,marks,dense_rank() over( order by name ) as ranks
from std_D_D order by marks desc
but what I need is from this table above, I need to get the second lowest rank. I want to say what I want:
ravi 88 4
I tried to get the second lowest rank, but I cannot get all the columns. I tried this query:
select max(a.ranks) as b from (
select name,marks,dense_rank() over( order by name ) as ranks
from std_D_D ) as a where a.ranks not in
(
select max(a.ranks) as b from (
select name,marks,dense_rank() over( order by name ) as ranks
from std_D_D ) as a )
+3
source to share
3 answers
Let me start by saying that if you use DENSE_RANK()
you will get the same rating for people with the same grades, which is not the same as your intended rank.
EDIT
Added an extra based on OP's comment ORDER BY name DESC
.
Sample data
DECLARE @std_D_D table
(
name VARCHAR(10),
marks int
)
insert into @std_D_D values
('raja', 88),
('ravi', 88),
('karthik', 99),
('praveen', 99),
('vijay', 70);
Query
;WITH CTE
AS
(
SELECT name,marks,dense_rank() over(ORDER BY marks ASC,name DESC) as ranks
from @std_D_D
)
SELECT name,marks,ranks
FROM CTE
WHERE ranks = 2
The result of this query will give you
ravi 88 2
0
source to share