【问题标题】:SQL Server 2008 R2: Find a second largest number in the table [duplicate]SQL Server 2008 R2:在表中查找第二大数字[重复]
【发布时间】:2015-07-19 10:58:41
【问题描述】:

我有下表中的一些数据来查找第二大数字。

表:

ColA
---------
3
23
43
673
173
373
273

【问题讨论】:

  • 如果表中最大的数是两次怎么办?
  • @Amit 一个简单的问题并不代表家庭作业/课程。但是,关于自我努力 - 我同意。
  • @RoyiNamir - 那么你为什么要回答这样的问题呢?你不应该通过奖励别人的答案来鼓励他们提出这样的问题,你应该去激励他们。投反对票。
  • @Amit 他问了一个问题。如果他想让其他人在不学习的情况下解决他的练习 - 那是他的问题。他会因此而失败。不是我。我将成为一个更好的程序员,因为我又解决了一个问题。我的反对票对这里的任何人都没有帮助。如果问题纯粹是书面的,不清楚等,我会投反对票。de-motivate(如你所说)从来没有帮助过任何人,也不会。
  • 链接stackoverflow.com/questions/16234983/…中的大多数答案在多次存在相同工资时返回错误结果,例如10,20,30,30 -> 第二高的是 20,而不是 30。必须使用 DENSE_RANK 而不是 ROW_NUMBER。

标签: sql sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

使用这个:

select * from 
(select colA  , row_number() over(order by colA desc) as rn from Table) T
where T.rn=2

感谢 Martin / dnoeth 的评论:

最多 2 个整数可能会出现问题

使用这个:

  select * from 
    (select colA  , DENSE_RANK( ) OVER (ORDER BY colA  ) as rn from Table) T
    where T.rn=2

附加信息:(一劳永逸(学习它!,我总是用它)):

DECLARE @t TABLE(NAME NVARCHAR(MAX),val money)

insert INTO @t SELECT 'a',100
insert INTO @t SELECT 'a',100
insert INTO @t SELECT 'a',100
insert INTO @t SELECT 'a',100
insert INTO @t SELECT 'b',200
insert INTO @t SELECT 'b',200
insert INTO @t SELECT 'd',400
insert INTO @t SELECT 'e',500
insert INTO @t SELECT 'f',600
select  Name,
        val,
        ROW_NUMBER() OVER (PARTITION BY NAME  ORDER BY name),
        val/ SUM(val) OVER(PARTITION BY NAME )  AS '1AgainstTotalHimself',
        val/ SUM(val) OVER( )  AS '1AgainstOthers' , 
        NTILE(2) OVER ( PARTITION BY NAME ORDER BY name) AS 'ntile2' ,
        NTILE(2) OVER ( ORDER BY name) AS 'ntile' , -- ( 9%2=1  , so group #1 will get more number) 
        RANK( ) OVER ( ORDER BY name  ) AS  Rank,
        DENSE_RANK( ) OVER (ORDER BY name) AS DENSERANK

from @t

结果:

【讨论】:

  • 当多行共享相同的薪水时,切换到 DENSE_RANK 而不是 ROW_NUMBER 以获得正确的结果。
  • @dnoeth 谢谢。确实你和马丁是对的!
【解决方案2】:

解决这个问题的一种方法是 罢工>

with cte as (
    select ColA, 
           Row_number() over(order by ColA DESC) As rn
    FROM Table
)

SELECT ColA
FROM cte
WHERE rn = 2

更新 在马丁的正确评论之后,这是一个更好的答案:

Select top 1 ColA
From YourTable
WHERE ColA < (
   SELECT MAX(ColA) 
   FROM YourTable
)
ORDER BY ColA DESC

【讨论】:

  • 如果出现两次,这可能会找到最大的数字。
  • 或者干脆用 DENSE_RANK 代替 ROW_NUMBER
  • @MartinSmith 我开始思考,我的解决方案也会产生错误的结果。
  • @RoyiNamir 是的。我认为一个评论就足够了,而不是垃圾邮件所有的答案。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多