获取表中第二高的值

Mah*_*hed 16 sql-server greatest-n-per-group

id value
1   50
2   60
3   55

select max(value) from tablename;
Run Code Online (Sandbox Code Playgroud)

一般我们知道,我们会得到 60,但我需要下一个值 55。

如何使用 SQL 获取值 55?

Mar*_*ith 25

要获得表中第二高的不同值,您可以使用

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);
Run Code Online (Sandbox Code Playgroud)


小智 24

假设最高值只出现一次,另一种方法是使用OFFSET(SQL Server 2012 或更高版本):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;
Run Code Online (Sandbox Code Playgroud)


Swa*_*ate 13

通用解决方案如下所示:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem
Run Code Online (Sandbox Code Playgroud)

在这里,您还可以定义范围,如RowNum >= 10 AND RowNum <= 20。它将为您提供第 10 到 20 行以及所有必需的列。


iri*_*ias 7

您有通常的顶级技巧,例如:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用 CTE,例如:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用最新版本的 SQLServer (>= 2012),滞后功能。

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc
Run Code Online (Sandbox Code Playgroud)


小智 5

我会这样做:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)
Run Code Online (Sandbox Code Playgroud)