Qual é a consulta SQL mais simples para encontrar o segundo maior valor?

StackOverflow https://stackoverflow.com/questions/32100

  •  09-06-2019
  •  | 
  •  

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.

Foi útil?

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

:

enter image description here

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top