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

时间:2020-03-05 18:44:20  来源:igfitidea点击:

在特定列中查找第二大整数值的最简单的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));

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