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

该列中可能存在重复值。

有帮助吗?

解决方案

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

其他提示

SELECT MAX(col) FROM table WHERE col NOT IN (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;

我想你可以这样做:

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 *
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 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 `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

此查询将从结果中返回最高薪水 - 不包含整个表中的最高薪水。

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

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

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

希望这有助于获得任何行的值......

最简单的

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

这是非常简单的代码,你可以试试这个:-

前任 :表名=测试

salary 

1000
1500
1450
7500

MSSQL代码获取第二大值

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

这里“偏移 1 行”表示表的第 2 行,“仅获取下 1 行”表示仅显示该 1 行。如果您不使用“仅获取接下来的 1 行”,那么它会显示第二行中的所有行。

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

笔记

sal 是 col 名称
emp 是表名

汤姆,相信当返回多个值时这会失败 select max([COLUMN_NAME]) from [TABLE_NAME] 部分。IE。其中数据集中有超过 2 个值。

对您的查询稍作修改即可 -

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

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

select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1

这是最简单的方法:

SELECT
      Column name
FROM
      Table name 
ORDER BY 
      Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1

正如您提到的重复值。在这种情况下你可以使用 清楚的通过...分组 找出第二高的值

这是一张桌子

薪水

:

enter image description here

通过...分组

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 的第二部分 = 有多少值

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

这将返回 emp 表中第三高的 sal

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

不需要子查询...只需跳过一行并按降序排列后选择第二行

像这样的东西吗?不过我还没有测试过:

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

如何选择SQL数据库表中的第n行?.

Sybase SQL Anywhere 支持:

SELECT TOP 1 START AT 2 value from table ORDER BY value

使用相关查询:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

此查询选择最多三个薪水。如果两个雇员的工资相同,这不会影响查询。

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 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC

通过更改突出显示的 Top 1TOP 2, 3 或者 4 你可以分别找到第三、第四和第五高的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top