题
查找特定列中第二大整数值的最简单的 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
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
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 1
到 TOP 2
, 3
或者 4
你可以分别找到第三、第四和第五高的。