¿Cuál es la consulta SQL más simple para encontrar el segundo valor más grande?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es la consulta SQL más simple para encontrar el segundo valor entero más grande en una columna específica?

Quizás haya valores duplicados en la columna.

¿Fue útil?

Solución

SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

Otros consejos

SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);

En T-Sql hay dos formas:

--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 dos veces más rápida que la segunda, incluso si la columna en cuestión está agrupada.

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

Alternativamente, en Microsoft SQL 2005 y superior puede utilizar el ROW_NUMBER() función:

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

Veo aquí algunas soluciones específicas de SQL Server y algunas específicas de MySQL, por lo que es posible que desee aclarar qué base de datos necesita.Aunque si tuviera que adivinar diría SQL Server ya que esto 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 cuáles acepta.Finalmente, veo algunos que funcionarán pero que realizarán dos escaneos completos de la mesa.Desea asegurarse de que el segundo escaneo solo analice 2 valores.

Servidor SQL (anterior a 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

Actualizar:

SQL Server 2012 ahora admite una solución mucho más limpia (y estándar) Sintaxis de DESPLAZAMIENTO/FETCH:

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

Supongo que puedes 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.Pista:SQL Server no hace LIMIT.

puede encontrar el segundo valor más grande de la columna utilizando la siguiente consulta

SELECT *
FROM TableName a
WHERE
  2 = (SELECT count(DISTINCT(b.ColumnName))
       FROM TableName b WHERE
       a.ColumnName <= b.ColumnName);

puedes encontrar más detalles en el siguiente enlace

http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html

Lo más sencillo sería obtener 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 debes seleccionar el segundo valor usando SQL, ¿qué tal:

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

Una consulta muy sencilla para encontrar el segundo valor más grande.

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 devolverá el salario máximo, a partir del resultado, que no contiene el salario máximo de la tabla general.

Vieja pregunta, lo 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

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 esto ayude a obtener el valor de cualquier fila.....

El mas simple de todos

select sal from salary order by sal desc limit 1 offset 1

Este es un código muy simple, puedes probar esto: -

ex :Nombre de la tabla = prueba

salary 

1000
1500
1450
7500

Código MSSQL para obtener el segundo valor más grande

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

aquí 'desplazar 1 filas' significa la segunda fila de la tabla y 'buscar solo las siguientes 1 filas' es para mostrar solo esa 1 fila.Si no utiliza 'buscar solo las siguientes 1 filas', muestra todas las filas de la segunda fila.

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

Nota

sal es el nombre de col
emp es el nombre de la tabla

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

Una ligera modificación en su 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));

La subconsulta devuelve todos los valores excepto el mayor.seleccione el valor máximo de la lista devuelta.

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

Es la forma más 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 mencionaste valores duplicados.En tal caso podrá utilizar DISTINTO y AGRUPAR POR para averiguar el segundo valor más alto

Aquí hay una mesa

salario

:

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

Primera parte de LIMIT = índice inicial

Segunda parte de LIMIT = cuántos valores

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

esto devolverá la tercera sal más alta de la tabla 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

No hay necesidad de subconsultas...simplemente omita una fila y seleccione la segunda fila después del orden descendente

¿Algo como esto?Aunque no lo he probado:

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

Ver ¿Cómo seleccionar la enésima fila en una tabla de base de datos SQL?.

Sybase SQL en cualquier lugar admite:

SELECT TOP 1 START AT 2 value from table ORDER BY value

Usando una 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 selecciona los tres salarios máximo.Si dos empleados reciben el mismo salario, esto no afecta la consulta.

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

Esto funciona en MS SQL:

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

Consulta para encontrar el segundo número más alto de 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 lo resaltado Top 1 a TOP 2, 3 o 4 Puedes encontrar el 3º, 4º y 5º más alto respectivamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top