SQL Server 2008 R2:在 table 中找到第二大数字
SQL Server 2008 R2: Find a second largest number in the table
我有以下 table 一些数据,以找到第二大数字。
Table:
ColA
---------
3
23
43
673
173
373
273
使用这个:
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
结果:
解决这个问题的一种方法是
with cte as (
select ColA,
Row_number() over(order by ColA DESC) As rn
FROM Table
)
SELECT ColA
FROM cte
WHERE rn = 2
更新
在 Martin 的正确评论之后,这里有一个更好的答案:
Select top 1 ColA
From YourTable
WHERE ColA < (
SELECT MAX(ColA)
FROM YourTable
)
ORDER BY ColA DESC
我有以下 table 一些数据,以找到第二大数字。
Table:
ColA
---------
3
23
43
673
173
373
273
使用这个:
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
结果:
解决这个问题的一种方法是
with cte as (
select ColA,
Row_number() over(order by ColA DESC) As rn
FROM Table
)
SELECT ColA
FROM cte
WHERE rn = 2
更新 在 Martin 的正确评论之后,这里有一个更好的答案:
Select top 1 ColA
From YourTable
WHERE ColA < (
SELECT MAX(ColA)
FROM YourTable
)
ORDER BY ColA DESC