Answers:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
在T-Sql中,有两种方法:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by col desc
在Microsoft SQL中,即使所讨论的列是群集的,第一种方法的速度也是第二种方法的两倍。
这是因为与max
聚合使用的表或索引扫描相比,排序操作相对较慢。
或者,在Microsoft SQL 2005及更高版本中,可以使用以下ROW_NUMBER()
功能:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
我在这里看到一些特定于SQL Server的解决方案和某些特定于MySQL的解决方案,因此您可能需要弄清所需的数据库。尽管如果我不得不猜测,我会说SQL Server,因为在MySQL中这是微不足道的。
我还看到一些无法使用的解决方案,因为它们没有考虑重复的可能性,因此请小心接受哪些解决方案。最后,我看到一些可以使用的方法,但是它将对表进行两次完整的扫描。您要确保第二次扫描仅查看2个值。
SQL Server(2012年前):
SELECT MIN([column]) AS [column]
FROM (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
更新:
SQL Server 2012现在支持更简洁(和标准)的OFFSET / FETCH语法:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
。这个经受住了考验。
TOP
,并OFFSET
在相同的查询。
我想您可以执行以下操作:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
要么
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
取决于您的数据库服务器。提示:SQL Server不执行LIMIT。
OFFSET 2
您可以使用以下查询找到列的第二大值
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
您可以在以下链接上找到更多详细信息
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
该查询将从结果中返回最高薪水-不包含总表中的最高薪水。
这是非常简单的代码,您可以尝试:-
例如:表名称=测试
salary
1000
1500
1450
7500
MSSQL代码获得第二大价值
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
这里“偏移1行”表示表的第二行,“仅获取下1行”仅用于显示该1行。如果您不使用“仅获取下1行”,那么它将显示第二行中的所有行。
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
希望此帮助获得任何行的值.....
正如您提到的重复值。在这种情况下,您可以使用DISTINCT和GROUP BY找出第二高的值
这是一张桌子
薪水
:
通过...分组
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
不同
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
LIMIT的第一部分=起始索引
LIMIT的第二部分=多少值
Sybase SQL Anywhere支持:
SELECT TOP 1 START AT 2 value from table ORDER BY value