2008-08-28 158 views

Respuesta

225
SELECT MAX(col) 
    FROM table 
WHERE col < (SELECT MAX(col) 
       FROM table) 
+5

Matt's así como también la respuesta de Vinoy se ocupa de los duplicados. Supongamos que se repite el valor más grande y luego usar la respuesta de Matt producirá el segundo mayor valor correcto, mientras que si utilizó el enfoque _top 2 desc_ y _min_, puede obtener el valor más grande en su lugar. –

+0

¿Qué pasa si hay varios segundos más altos ... Entonces esto no dará todas las Tuplas –

+1

gracias, lo usó para encontrar la segunda última fecha [aquí] (http://stackoverflow.com/questions/8590296/sql-returning- second-latest-record/28913915 # 28913915) – stom

5

Lo más fácil sería conseguir el segundo valor de este conjunto de resultados en la aplicación:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2 

Pero si se debe seleccionar el segundo valor de uso de SQL, ¿qué tal:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t 
+1

¿Ha ejecutado esto en SQL Server? – Craig

+1

@Craig - 'LIMIT' es la sintaxis de MySql, la pregunta no especifica una versión de SQL. – Keith

10

I supongamos que usted puede hacer algo como:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1 

o

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1) 

dependiendo de su servidor de base de datos. Sugerencia: SQL Server no hace LIMIT.

+0

update- SQL Server 2012 agregó una cláusula offset/fetch similar a la anterior http://dbadiaries.com/new-t-sql-features-in-sql-server-2012-offset-and-fetch – iliketocode

+0

Supongamos que tiene 2 elementos con el mismo valor pero también el elemento más grande. Supongo que tienes que hacer 'OFFSET 2' – Kangkan

0
select top 1 MyIntColumn from MyTable 
where 
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc) 
order by MyIntColumn desc 
0

Esto funciona en MS SQL:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
(select max([COLUMN_NAME]) from [TABLE_NAME]) 
0

Algo como esto? Yo no lo he probado, sin embargo:

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

En T-SQL hay dos maneras:

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

En Microsoft SQL La primera forma es el doble de rápido que el segundo, aunque la columna en cuestión está agrupado.

Esto se debe a que la operación de clasificación es relativamente lenta en comparación con la tabla o exploración de índice que utiliza la agregación max.

alternativa, en Microsoft SQL 2005 y arriba se puede utilizar la función ROW_NUMBER():

select col 
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col 
    from [table]) withRowNum 
where rowNum = 2 
14

veo tanto algunos de SQL Server específico y algunas soluciones específicas de MySQL aquí, así que sería bueno para aclarar qué base de datos que necesita. Aunque si tuviera que adivinar, diría que SQL Server es trivial en MySQL.

También veo algunas soluciones que no funcionarán porque no tienen en cuenta la posibilidad de duplicados, así que tenga cuidado con los que acepte. Finalmente, veo algunos que funcionarán pero que harán dos escaneos completos de la tabla. Desea asegurarse de que el segundo escaneo solo está viendo 2 valores.

SQL Server (pre-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 

Actualización:

SQL Server 2012 ahora es compatible con un mucho más limpio (y standard) OFFSET/Sintaxis FETCH:

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC 
OFFSET 1 ROWS 
FETCH NEXT 1 ROWS ONLY; 
+0

Esto es lo que esperaba ver. La respuesta aceptada se vuelve fea si necesita que funcione para cualquier 'n'. Este soporta esa prueba. –

+0

@RobinMaben Robin, ¿qué hay del escenario cuando se repite el valor más grande? Supongamos que una columna contiene los números del 1 al 100, pero 100 se repite dos veces. Entonces esta solución producirá el segundo valor más grande como 100, que será incorrecto. ¿Derecha? –

+1

@PankajSharma no, esto seguirá funcionando, debido a la cláusula GROUP BY –

0
select * from emp e where 3>=(select count(distinct salary) 
    from emp where s.salary<=salary) 

Esta consulta selecciona los tres salarios máximos. Si dos emp obtienen el mismo salario, esto no afecta la consulta.

0

Usando una consulta correlacionada:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a) 
1

Tom, creo que esto se producirá un error cuando hay más de un valor devuelto en select max([COLUMN_NAME]) from [TABLE_NAME] sección. es decir, donde hay más de 2 valores en el conjunto de datos.

Ligera modificación de la consulta funcionará -

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
    (select max([COLUMN_NAME]) from [TABLE_NAME]) 
1
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 devuelve todos los valores distintos de los más grandes. seleccione el valor máximo de la lista devuelta.

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

Nota

Sal es el nombre col
EMP es nombre de la tabla

49
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table); 
1
select col_name 
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name 
    from table_name) withrank 
where rank = 2 
2

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 

Esperanza esta ayuda a obtener el valor de cualquier fila .....

1
SELECT 
    * 
FROM 
    table 
WHERE 
    column < (SELECT max(columnq) FROM table) 
ORDER BY 
    column DESC LIMIT 1 
3

Una consulta muy simple para encontrar el valor de la segunda mayor

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1; 
0

de consulta para buscar el segundo número más alto en una fila-

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 

Al cambiar el resaltado Top 1 a TOP 2, 3 o 4 u puede encontrar los días 3, 4 y 5 de alto, respectivamente.

0

También podemos hacer uso de la orden por la parte superior y 1 elemento de la siguiente manera:

Select top 1 col_name from table_name 
where col_name < (Select top 1 col_name from table_name order by col_name desc) 
order by col_name desc 
0
SELECT * FROM EMP 
WHERE salary= 
     (SELECT MAX(salary) FROM EMP 
      WHERE salary != (SELECT MAX(salary) FROM EMP) 
     ); 
0

Esta es una otra forma de encontrar el segundo mayor valor de una column.Consider la tabla 'Estudiante' y la columna 'Age'.Then la consulta es,

select top 1 Age from Student where Age in(select distinct top 2 Age from Student order by Age desc) order by Age asc 
1

es la forma más esiest:

SELECT 
     Column name 
FROM 
     Table name 
ORDER BY 
     Column name DESC 
LIMIT 1,1 
0

Probar:

select a.* ,b.* from 
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount desc) SrNo1, fc_amount as amount1 From entry group by fc_amount) tbl where tbl.SrNo1 = 2) a 
, 
(select * from (select ROW_NUMBER() OVER(ORDER BY fc_amount asc) SrNo2, fc_amount as amount2 From entry group by fc_amount) tbl where tbl.SrNo2 =2) b 
0
select * from [table] where (column)=(select max(column)from [table] where column < (select max(column)from [table])) 
0

Utilice esta consulta.

SELECT MAX (colname) 
FROM Tablename 
where colname < (
    SELECT MAX(colname) 
    FROM Tablename) 
+2

Esta respuesta es idéntica a la respuesta de @Matt Rogish que se publicó hace 6 años y desde hace mucho tiempo se ha marcado como correcta. Esta respuesta no agrega nada y debe ser eliminada. – DMK

0
select MAX(salary) as SecondMax from test where salary !=(select MAX(salary) from test) 
0
select age from student group by id having age<(select max(age) from student)order by age limit 1 
3
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee) 

Esta consulta devolverá el salario máximo, a partir del resultado - que no contiene salario máximo de la tabla general.

+1

¿Puede [editar] explicar cómo esto es significativamente diferente de las respuestas anteriores? –

2

más simple de todos

select sal from salary order by sal desc limit 1 offset 1 
0
select score 
from table 
where score = (select max(score)-1 from table) 
0

Microsoft SQL Server - Utilización de dos tops para el enésimo valor más alto (alias sub-consulta).

para resolver la segunda más alta:

SELECT TOP 1 q.* 
FROM (SELECT TOP 2 column_name FROM table_name ORDER BY column_name DESC) as q 
ORDER BY column_name ASC; 

principales usos dos veces, pero requiere una sub-consulta con alias. Esencialmente, la consulta interna toma los 2 valores más grandes en orden descendente, luego la consulta externa se voltea en orden ascendente de modo que la segunda más alta está ahora en la parte superior. La instrucción SELECT devuelve esta parte superior.

Para resolver el n-ésimo valor más alto, modifique el valor TOP de la subconsulta. Por ejemplo:

SELECT TOP 1 q.* 
FROM (SELECT TOP 5 column_name FROM table_name ORDER BY column_name DESC) as q 
ORDER BY column_name; 

Devolvería el 5to valor más alto.

2

pregunta Antiguo sé, pero esto me dio un mejor plan ejecutivo:

SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc) 
FROM TABLE 
GROUP BY column 
0
select extension from [dbo].[Employees] order by extension desc offset 2 rows fetch next 1 rows only 
+0

Proporcione más detalles a su respuesta, ya que esta publicación se ha encontrado en publicaciones de baja calidad. Solo se desaconseja el código y las respuestas "prueba esto" ya que no proporciona ningún contenido de búsqueda y por qué la gente debería "probar esto". – Paritosh

1

Como usted ha mencionado valores duplicados.En tal caso, es posible utilizar DISTINCT y GROUP BY para averiguar segundo valor más alto

Aquí hay una tabla

salario

:

enter image description here

GROUP BY

SELECT amount FROM salary 
GROUP by amount 
ORDER BY amount DESC 
LIMIT 1 , 1 

DISTINCT

SELECT DISTINCT amount 
FROM salary 
ORDER BY amount DESC 
LIMIT 1 , 1 

La primera porción de LIMIT = partir índice

La segunda porción del máximo = cuántos valor

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

esto devolverá el tercero más alto de la tabla emp Sal ​​

-1

muy simple. La palabra clave distinct también se ocupará de los duplicados.

SELECT distinct SupplierID FROM [Products] order by SupplierID desc limit 1 offset 1 
0

La forma más fácil de llegar segunda fila pasada de una tabla de SQL es utilizar ORDER BYColumnNameDESC y establecer LIMIT 1,1.

Prueba esto:

SELECT * from `TableName` ORDER BY `ColumnName` DESC LIMIT 1,1 
+0

Esto parece ser una repetición de algunas de las respuestas existentes. – Pang

0

Este es un código muy simple, usted puede intentar esto: -

ejemplo: Tabla name = prueba

salary 

1000 
1500 
1450 
7500 

Código MSSQL para obtener 2 más grande valor

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

aquí 'offset 1 rows' significa 2da fila de la tabla y 'buscar siguiente 1 fila solamente' es para mostrar solo esa 1 fila. si no usa 'buscar solo las siguientes 1 filas', entonces muestra todas las filas de la segunda fila.

0

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 

No hay necesidad de consultas sub ...acaba de saltar una fila y seleccione la segunda fila después de la orden descendente por

-1
SELECT * FROM `employee` WHERE employee_salary = (SELECT employee_salary 
FROM`employee` GROUP BY employee_salary ORDER BY employee_salary DESC LIMIT 
1,1) 
0
select max(column_name) from table_name 
where column_name not in (select max(column_name) from table_name); 

no en es una condición que excluye el valor más alto de COLUMN_NAME.

Referencia: programmer interview

0

puede encontrar enésimo valor más alto usando la siguiente consulta.

select top 1 UnitPrice from (select distinct top n UnitPrice from 
[Order Details] order by UnitPrice desc) as Result order by UnitPrice asc 

Aquí, el valor de n será 1 (para el número más alto), 2 (para el número de segundos más alto), 3 (para el tercer número más alto) ... compensar para este

Cuestiones relacionadas