使用密集秩函数的第二最大值

Second maximum value by using dense rank function

我table喜欢:

name     marks
raja     88
ravi     88
karthik  99
praveen  99
vijay    70

在那 table 我假设 table 的排名是:

name      marks        rank 
karthirk    99           1
praveen     99           2
raja        88           3
ravi        88           4
vijay       77           5

我通过使用 dense rank() 函数得到它:

select  name,marks,dense_rank() over(  order by name ) as ranks
from std_D_D order by marks desc

但我需要的是上面的 table 我需要获得倒数第二的排名。 我的意思是我想要的输出是:

ravi 88   4

我试图获得第二低的排名,但我无法获得所有列。我试过这个查询:

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 )

你可以颠倒排名,select第二个:

SELECT name, marks
FROM   (SELECT name, makrs, DENSE_RANK() OVER (ORDER BY name DESC) AS ranks
        FROM   std_D_D) t
WHERE  ranks = 2

首先我要说的是,如果您使用 DENSE_RANK(),那么对于具有相同分数的人,您将获得相同的排名,这与您假定的排名不同。

编辑

根据 OP 的评论,添加了额外的 ORDER BY name DESC

示例数据

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);

查询

;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

此查询的输出将为您提供

ravi    88  2

回答我上面的问题:

SELECT * FROM

(SELECT NAME,MARKS,dense_RANK() OVER(ORDER BY RANK DESC,name) AS TEMP_ORDER FROM

(SELECT *,DENSE_RANK() OVER(ORDER BY MARKS DESC,NAME) AS RANK FROM std_D_D) A
) B WHERE TEMP_ORDER=2;