. utilizar offset para este purpos ... Selecione extensão de [dbo] [Empregados] ordem por extensão desc compensado 2 linhas buscar próximas linhas 1 única
Jinto John
Respostas:
294
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
A resposta de Matt e Vinoy também cuida de duplicatas. Suponha que o maior valor seja repetido e, em seguida, usar a resposta de Matt produzirá o segundo maior valor correto, enquanto se você usou a abordagem 2 desc e min , poderá obter o maior valor.
Pankaj Sharma
E se houver vários segundos mais altos ... Então isso não dará todas as Tuplas
Parth Satra
2
obrigado, usou isso para encontrar penúltima data aqui
shaijut
Muito melhor do que a minha abordagem usando ORDER_BY e LIMIT para a instrução interior
andig
Observe que isso não retornará um resultado se não houver registros antes do solicitado.
andig
61
SELECT MAX(col)FROMtableWHERE col NOTIN(SELECT MAX(col)FROMtable);
--filter out the maxselect max( col )from[table]where col <(select max( col )from[table])--sort top two then bottom oneselecttop1 col
from(selecttop2 col
from[table]orderby col) topTwo
orderby col desc
No Microsoft SQL, a primeira maneira é duas vezes mais rápida que a segunda, mesmo se a coluna em questão estiver em cluster.
Isso ocorre porque a operação de classificação é relativamente lenta em comparação com a tabela ou a varredura de índice que a maxagregação usa.
Como alternativa, no Microsoft SQL 2005 e acima, você pode usar a ROW_NUMBER()função:
select col
from(select ROW_NUMBER()over(orderby col asc)as'rowNum', col
from[table]) withRowNum
where rowNum =2
Vejo aqui algumas soluções específicas do SQL Server e algumas específicas do MySQL, portanto, você pode esclarecer qual banco de dados precisa. Embora, se eu tivesse que adivinhar, diria o SQL Server, pois 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; portanto, tome cuidado com as que você aceita. Por fim, vejo alguns que funcionarão, mas que farão duas varreduras completas da tabela. Você deseja garantir que a 2ª varredura esteja apenas com 2 valores.
SQL Server (antes de 2012):
SELECT MIN([column])AS[column]FROM(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
Era isso que eu esperava ver. A resposta aceita fica feia se você precisar trabalhar para alguma n. Este é aquele teste.
9788 Robin Maben
@RobinMaben Robin, que tal o cenário em que o maior valor é repetido? Suponha que uma coluna contenha os números de 1 a 100, mas 100 seja repetido duas vezes. Em seguida, esta solução produzirá o segundo maior valor como 100, o que estará incorreto. Certo?
Pankaj Sharma
1
@PankajSharma não, este trabalho ainda, por causa da cláusula GROUP BY
Joel Coehoorn
Esta é a maneira padrão de fazer isso. A resposta aceita deve ser atualizada para esta.
Guilherme Melo
1
Eu recebo um erro que diz que não posso usar TOPe OFFSETna mesma consulta.
Este é um código muito simples, você pode tentar o seguinte: -
ex: nome da tabela = teste
salary
1000150014507500
Código MSSQL para obter o segundo maior valor
select salary from test orderby salary desc offset 1rowsfetch next 1rows only;
aqui 'deslocamento de 1 linha' significa a segunda linha da tabela e 'buscar apenas as 1 linhas seguintes' serve apenas para mostrar essa 1 linha. se você não usar 'buscar somente as próximas 1 linhas', mostrará todas as linhas da segunda linha.
Tom, acredite que isso falhará quando houver mais de um valor retornado na select max([COLUMN_NAME]) from [TABLE_NAME]seção. ou seja, onde existem mais de 2 valores no conjunto de dados.
Uma pequena modificação na sua consulta funcionará -
Respostas:
fonte
fonte
No T-Sql, existem duas maneiras:
No Microsoft SQL, a primeira maneira é duas vezes mais rápida que a segunda, mesmo se a coluna em questão estiver em cluster.
Isso ocorre porque a operação de classificação é relativamente lenta em comparação com a tabela ou a varredura de índice que a
max
agregação usa.Como alternativa, no Microsoft SQL 2005 e acima, você pode usar a
ROW_NUMBER()
função:fonte
Vejo aqui algumas soluções específicas do SQL Server e algumas específicas do MySQL, portanto, você pode esclarecer qual banco de dados precisa. Embora, se eu tivesse que adivinhar, diria o SQL Server, pois 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; portanto, tome cuidado com as que você aceita. Por fim, vejo alguns que funcionarão, mas que farão duas varreduras completas da tabela. Você deseja garantir que a 2ª varredura esteja apenas com 2 valores.
SQL Server (antes de 2012):
MySQL:
Atualizar:
O SQL Server 2012 agora oferece suporte a uma sintaxe OFFSET / FETCH muito mais limpa (e padrão ):
fonte
n
. Este é aquele teste.TOP
eOFFSET
na mesma consulta.Suponho que você possa fazer algo como:
ou
dependendo do seu servidor de banco de dados. Dica: o SQL Server não executa LIMIT.
fonte
OFFSET 2
O mais fácil seria obter o segundo valor desse conjunto de resultados no aplicativo:
Mas se você deve selecionar o segundo valor usando SQL, que tal:
fonte
LIMIT
é a sintaxe MySql, a questão não especifica uma versão SQL.você pode encontrar o segundo maior valor da coluna usando a seguinte consulta
você pode encontrar mais detalhes no seguinte link
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
fonte
Uma consulta muito simples para encontrar o segundo maior valor
fonte
MSSQL
MySQL
Não há necessidade de subconsultas ... basta pular uma linha e selecionar as segundas linhas após o pedido, descendo
fonte
Esta consulta retornará o salário máximo, do resultado - que não contém o salário máximo da tabela geral.
fonte
Velha pergunta eu sei, mas isso me deu um plano executivo melhor:
fonte
Este é um código muito simples, você pode tentar o seguinte: -
ex: nome da tabela = teste
Código MSSQL para obter o segundo maior valor
aqui 'deslocamento de 1 linha' significa a segunda linha da tabela e 'buscar apenas as 1 linhas seguintes' serve apenas para mostrar essa 1 linha. se você não usar 'buscar somente as próximas 1 linhas', mostrará todas as linhas da segunda linha.
fonte
Espero que esta ajuda obtenha o valor para qualquer linha .....
fonte
Mais simples de tudo
fonte
Nota
sal é nome da coluna
emp é nome da tabela
fonte
Tom, acredite que isso falhará quando houver mais de um valor retornado na
select max([COLUMN_NAME]) from [TABLE_NAME]
seção. ou seja, onde existem mais de 2 valores no conjunto de dados.Uma pequena modificação na sua consulta funcionará -
fonte
subconsulta retorna todos os valores que não sejam os maiores. selecione o valor máximo na lista retornada.
fonte
fonte
fonte
É a maneira mais esiest:
fonte
fonte
Como você mencionou valores duplicados. Nesse caso, você pode usar DISTINCT e GROUP BY para descobrir o segundo valor mais alto
Aqui está uma mesa
:
Primeira parte de LIMIT = índice inicial
Segunda parte de LIMIT = quanto valor
fonte
isso retornará o terceiro maior sal da tabela emp
fonte
not in é uma condição que exclui o valor mais alto de column_name.
Referência: entrevista do programador
fonte
Algo assim? Eu ainda não testei:
fonte
Consulte Como selecionar a enésima linha em uma tabela de banco de dados SQL? .
O Sybase SQL Anywhere suporta:
fonte
Usando uma consulta correlacionada:
fonte
Esta consulta seleciona o máximo de três salários. Se dois emp recebem o mesmo salário, isso não afeta a consulta.
fonte
fonte
Isso funciona no MS SQL:
fonte