查找第二大价值的最简单的SQL查询是什么?


168

在特定列中查找第二大整数值的最简单的SQL查询是什么?

列中可能有重复的值。


为此目的使用偏移量...从[dbo]中选择扩展名。[员工]按扩展名desc偏移量排序2行仅获取下1行
Jinto John

Answers:


294
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

7
马特(Matt)和维诺(Vinoy)的答案也处理重复项。假设重复最大值,然后使用Matt的答案将产生正确的第二个最大值,而如果使用前2个descmin方法,则可能会获得最大值。
Pankaj Sharma 2013年

如果存在多个第二高的情况怎么办...那么这将不会给所有元组
Parth Satra 2014年

2
谢谢,用它来在这里
shaijut 2015年

比我对内部语句使用ORDER_BY和LIMIT的方法要
好得多

请注意,如果在请求的记录之前没有记录,则不会返回结果。
andig 2015年

61
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);

31

在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

20

我在这里看到一些特定于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。这个经受住了考验。
罗宾·马本

@RobinMaben Robin,重复最大值会发生什么情况?假设一列包含数字1到100,但是100被重复两次。然后此解决方案将产生第二个最大值100,这将是不正确的。对?
Pankaj Sharma 2013年

1
@PankajSharma不,由于GROUP BY子句,这仍然可以使用
Joel

这是执行此操作的标准方法。接受的答案应更新为此。
Guilherme Melo 2014年

1
我得到它说我不能用一个错误TOP,并OFFSET在相同的查询。
虚假的

15

我想您可以执行以下操作:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

要么

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

取决于您的数据库服务器。提示:SQL Server不执行LIMIT。


更新-SQL Server 2012添加了类似于上述dbadiaries.com/…
iliketocode

假设您有两个具有相同值的元素,但也有最大的元素。我猜你必须做OFFSET 2
Kangkan

添加GROUP BY子句将满足此条件。
赛义夫(Saif)

7

最简单的方法是从应用程序中的此结果集中获取第二个值:

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

1
您是否在SQL Server上运行此程序?
克雷格

1
@Craig- LIMIT是MySql语法,问题未指定SQL版本。
基思


4

一个非常简单的查询来查找第二个最大值

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;

4

微软SQL

SELECT  *
  FROM [Users]
    order by UserId desc OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

的MySQL

SELECT  *
  FROM Users
    order by UserId desc LIMIT 1 OFFSET 1

无需子查询...只需跳过一行,然后按降序选择第二行



3

我知道的老问题,但这给了我一个更好的执行计划:

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column

3

这是非常简单的代码,您可以尝试:-

例如:表名称=测试

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行”,那么它将显示第二行中的所有行。


最优化和资源友好的答案。我在子查询中使用它节省了很多时间。谢谢。
vibs2006 '19

2

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

希望此帮助获得任何行的值.....


2

最简单

select sal from salary order by sal desc limit 1 offset 1

1
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

注意

sal是列名
emp是表名


1

汤姆(Tom),相信如果在select max([COLUMN_NAME]) from [TABLE_NAME]节中返回多个值,这将失败。即数据集中有两个以上的值。

轻微修改您的查询即可-

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
  ( select max([COLUMN_NAME]) from [TABLE_NAME] )

1
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));

子查询返回除最大值以外的所有值。从返回的列表中选择最大值。


1
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2

1
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1


1
select age from student group by id having age<(select max(age) from student)order by age limit 1

1

正如您提到的重复值。在这种情况下,您可以使用DISTINCTGROUP 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的第二部分=多少值


1
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )

这将返回emp表的第三高工资


1
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);

不存在是排除column_name最大值的条件。

参考:程序员面试


0

像这样吗 我还没有测试过:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x


0

使用相关查询:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)

0
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

此查询选择最多三个薪水。如果两个emp获得相同的薪水,这不会影响查询。


0
select top 1 MyIntColumn from MyTable
where
 MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc

0

这适用于MS SQL:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.