Qual é a consulta SQL mais simples para encontrar o segundo maior valor?
Pergunta
Qual é a consulta SQL mais simples para encontrar o segundo maior valor inteiro em uma coluna específica?
Talvez haja valores duplicados na coluna.
Solução
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Outras dicas
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
No T-Sql existem duas maneiras:
--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
No Microsoft SQL a primeira forma é duas vezes mais rápida que a segunda, mesmo que a coluna em questão esteja agrupada.
Isso ocorre porque a operação de classificação é relativamente lenta em comparação com a varredura de tabela ou índice que o max
usos de agregação.
Alternativamente, no Microsoft SQL 2005 e superior você pode usar o ROW_NUMBER()
função:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Vejo algumas soluções específicas do SQL Server e algumas soluções específicas do MySQL aqui, então você pode querer esclarecer qual banco de dados você precisa.Porém, se eu tivesse que adivinhar, diria SQL Server, já que isso é trivial no MySQL.
Também vejo algumas soluções que não funcionam porque não levam em consideração a possibilidade de duplicatas, por isso tome cuidado com quais você aceita.Por fim, vejo alguns que funcionarão, mas farão duas varreduras completas da tabela.Você quer ter certeza de que a segunda varredura está analisando apenas 2 valores.
SQL Server (pré-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
Atualizar:
O SQL Server 2012 agora oferece suporte a uma interface muito mais limpa (e padrão) Sintaxe OFFSET/FETCH:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
Suponho que você possa fazer algo como:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
ou
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
dependendo do seu servidor de banco de dados.Dica:O SQL Server não faz LIMIT.
você pode encontrar o segundo maior valor da coluna usando a seguinte consulta
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
você pode encontrar mais detalhes no seguinte link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
O mais fácil seria obter o segundo valor deste conjunto de resultados na aplicação:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Mas se você precisar selecionar o segundo valor usando SQL, que tal:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
Uma consulta muito simples para encontrar o segundo maior valor
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 )
Esta consulta retornará o salário máximo, do resultado - que não contém o salário máximo da tabela geral.
Pergunta antiga, eu sei, mas isso me deu um plano executivo melhor:
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
Espero que isso ajude a obter o valor de qualquer linha .....
O mais simples de tudo
select sal from salary order by sal desc limit 1 offset 1
Este é um código muito simples, você pode tentar isto: -
ex:Nome da tabela = teste
salary
1000
1500
1450
7500
Código MSSQL para obter o segundo maior valor
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
aqui 'deslocar 1 linha' significa a 2ª linha da tabela e 'buscar apenas as próximas 1 linhas' é para mostrar apenas aquela 1 linha.se você não usar 'buscar apenas as próximas 1 linhas', ele mostrará todas as linhas da segunda linha.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
Observação
sal é o nome da coluna
emp é o nome da tabela
Tom, acredito que isso irá falhar quando houver mais de um valor retornado em select max([COLUMN_NAME]) from [TABLE_NAME]
seção.ou sejaonde há mais de 2 valores no conjunto de dados.
Uma pequena modificação em sua consulta funcionará -
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));
subconsulta retorna todos os valores, exceto o maior.selecione o valor máximo na lista retornada.
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
É a maneira mais fácil:
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
Como você mencionou valores duplicados.Nesse caso você pode usar DISTINTO e Agrupar por para descobrir o segundo valor mais alto
Aqui está uma mesa
salário
:
Agrupar por
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
DISTINTO
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Primeira parte de LIMIT = índice inicial
Segunda parte de LIMIT = quantos valores
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )
isso retornará o terceiro maior sal da tabela emp
MSSQL
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
Não há necessidade de subconsultas ...basta pular uma linha e selecionar as segundas linhas após a ordem decrescente
Algo assim?Eu não testei, no entanto:
select top 1 x
from (
select top 2 distinct x
from y
order by x desc
) z
order by x
Ver Como selecionar a enésima linha em uma tabela de banco de dados SQL?.
O Sybase SQL Anywhere suporta:
SELECT TOP 1 START AT 2 value from table ORDER BY value
Usando uma consulta correlacionada:
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)
Esta consulta seleciona no máximo três salários.Se dois funcionários receberem o mesmo salário, isso não afetará a consulta.
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
Isso funciona no MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
Consulta para encontrar o segundo número mais alto em uma linha-
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
Ao alterar o destaque Top 1
para TOP 2
, 3
ou 4
você pode encontrar o 3º, 4º e 5º maior, respectivamente.