use offset para este propósito ... seleccione la extensión de [dbo]. [Empleados] ordene por extensión desc offset 2 filas busque las siguientes 1 filas solamente
Jinto John
Respuestas:
295
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
La respuesta de Matt y de Vinoy también se ocupa de los duplicados. Suponga que el valor más grande se repite y luego usar la respuesta de Matt producirá el segundo valor más grande correcto, mientras que si usó el enfoque 2 desc y min más alto , puede obtener el valor más grande.
Pankaj Sharma
¿Qué pasa si hay varios segundos más altos ... Entonces esto no dará todas las Tuplas
Parth Satra
2
gracias, usé esto para encontrar la segunda última cita aquí
shaijut
Mucho mejor que mi enfoque usando ORDER_BY y LIMIT para la declaración interna
andig
Tenga en cuenta que esto no devolverá un resultado si no hay registros anteriores al 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
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(orderby 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(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
Esto es lo que esperaba ver. La respuesta aceptada se vuelve fea si necesita que funcione para cualquiera n. Este resiste esa prueba.
Robin Maben
@ Robin Robin, ¿qué tal el escenario cuando se repite el valor más grande? Suponga que una columna contiene 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. ¿Correcto?
Pankaj Sharma
1
@PankajSharma no, esto seguirá funcionando, debido a la cláusula GROUP BY
Joel Coehoorn el
Esta es la forma estándar de hacer esto. La respuesta aceptada debe actualizarse a esta.
Guilherme Melo
1
Recibo un error que dice que no puedo usar TOPy OFFSETen la misma consulta.
Este es un código muy simple, puedes probar esto: -
Ej: nombre de tabla = prueba
salary
1000150014507500
Código MSSQL para obtener el segundo valor más grande
select salary from test orderby salary desc offset 1rowsfetch next 1rows 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.
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.
Respuestas:
fuente
fuente
En T-Sql hay dos formas:
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:fuente
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):
MySQL:
Actualizar:
SQL Server 2012 ahora admite una sintaxis OFFSET / FETCH mucho más limpia (y estándar ):
fuente
n
. Este resiste esa prueba.TOP
yOFFSET
en la misma consulta.Supongo que puedes hacer algo como:
o
dependiendo de su servidor de base de datos. Sugerencia: SQL Server no hace LIMIT.
fuente
OFFSET 2
Lo más fácil sería obtener el segundo valor de este conjunto de resultados en la aplicación:
Pero si debe seleccionar el segundo valor usando SQL, ¿qué tal:
fuente
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
puedes encontrar más detalles en el siguiente enlace
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
fuente
Una consulta muy simple para encontrar el segundo valor más grande
fuente
MSSQL
MySQL
No es necesario realizar subconsultas ... solo omita una fila y seleccione las segundas filas después del pedido descendiendo
fuente
Esta consulta devolverá el salario máximo del resultado, que no contiene el salario máximo de la tabla general.
fuente
Antigua pregunta que conozco, pero esto me dio un mejor plan ejecutivo:
fuente
Este es un código muy simple, puedes probar esto: -
Ej: nombre de tabla = prueba
Código MSSQL para obtener el segundo valor más grande
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.
fuente
Espero que esta ayuda obtenga el valor de cualquier fila .....
fuente
Más simple de todos
fuente
Nota
sal es col nombre
emp es nombre de tabla
fuente
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á:
fuente
La subconsulta devuelve todos los valores que no sean los más grandes. seleccione el valor máximo de la lista devuelta.
fuente
fuente
fuente
Es la forma más fácil:
fuente
fuente
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
:
Primera porción de LIMIT = índice inicial
Segunda porción de LIMIT = cuántos valores
fuente
esto devolverá la tercera tabla más alta de sal de emp
fuente
no en es una condición que excluye el valor más alto de column_name.
Referencia: entrevista al programador
fuente
¿Algo como esto? Sin embargo, no lo he probado:
fuente
Consulte ¿Cómo seleccionar la enésima fila en una tabla de base de datos SQL? .
Sybase SQL Anywhere admite:
fuente
Usando una consulta correlacionada:
fuente
Esta consulta selecciona los tres salarios máximos. Si dos emp obtienen el mismo salario, esto no afecta la consulta.
fuente
fuente
Esto funciona en MS SQL:
fuente