查找第二大价值的最简单的SQL查询是什么?
在特定列中查找第二大整数值的最简单的SQL查询是什么?
列中可能有重复的值。
解决方案
回答
最简单的方法是从应用程序中的此结果集中获取第二个值:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
但是,如果必须使用SQL选择第二个值,该如何做:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
回答
我想我们可以执行以下操作:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
或者
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
取决于数据库服务器。提示:SQL Server不执行LIMIT。
回答
SELECT MAX( col ) FROM table WHERE col < ( SELECT MAX( col ) FROM table )
回答
select top 1 MyIntColumn from MyTable where MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc) order by MyIntColumn desc
回答
这适用于MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < ( select max([COLUMN_NAME]) from [TABLE_NAME] )
回答
像这样吗?我还没有测试过:
select top 1 x from ( select top 2 distinct x from y order by x desc ) z order by x
回答
在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数据库表中选择第n行?
Sybase SQL Anywhere支持:
SELECT TOP 1 START AT 2 value from table ORDER BY value
回答
我在这里看到一些特定于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;
回答
select * from emp e where 3>=(select count(distinct salary) from emp where s.salary<=salary)
此查询选择最多三个薪水。如果两个emp获得相同的薪水,这不会影响查询。
回答
使用相关查询:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
回答
汤姆,相信当[TABLE_NAME]部分的select max([COLUMN_NAME])中返回的值不止一个时,此操作将失败。即数据集中有两个以上的值。
轻微修改查询即可-
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** ( select max([COLUMN_NAME]) from [TABLE_NAME] )
回答
select max(COL_NAME) from TABLE_NAME where COL_NAME in (select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));
子查询返回除最大值以外的所有值。
从返回的列表中选择最大值。