¿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.
¿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.
Respuestas:
SELECT MAX( col )
FROM table
WHERE col < ( 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 la exploración de tabla o índice que el max
utiliza agregación.
Alternativamente, en Microsoft SQL 2005 y superior puede usar la 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 algunas soluciones específicas de SQL Server y algunas específicas de MySQL aquí, 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 las que acepta. Finalmente, veo algunos que funcionarán pero que harán dos escaneos completos de la tabla. Desea asegurarse de que la segunda exploración solo busque 2 valores.
SQL Server (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 sintaxis OFFSET / FETCH mucho más limpia (y estándar ):
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Este resiste esa prueba.
TOP
y OFFSET
en la misma consulta.
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. Sugerencia: SQL Server no hace LIMIT.
OFFSET 2
Lo más fácil 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 debe 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
LIMIT
es la sintaxis de MySql , la pregunta no especifica una versión de SQL.
puede encontrar el segundo valor más grande de 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
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 es necesario realizar subconsultas ... solo omita una fila y seleccione las segundas filas después del pedido descendiendo
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Esta consulta devolverá el salario máximo del resultado, que no contiene el salario máximo de la tabla general.
Este es un código muy simple, puedes probar esto: -
Ej: nombre de 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 las siguientes 1 filas solamente' 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 * 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 esta ayuda obtenga el valor de cualquier fila .....
Tom, cree que esto fallará cuando haya más de un valor devuelto en la 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 a su consulta funcionará:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
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, puede usar DISTINCT y GROUP BY para encontrar el segundo valor más alto
Aqui hay una mesa
salario
:
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 porción de LIMIT = índice inicial
Segunda porción de LIMIT = cuántos valores
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: entrevista al programador
Consulte ¿Cómo seleccionar la enésima fila en una tabla de base de datos SQL? .
Sybase SQL Anywhere admite:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc