使用密集秩函数的第二最大值
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;
我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;