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 行以及所有必需的列。
您有通常的顶级技巧,例如:
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)