resueltos optimizar optimizacion inner ejercicios ejemplos desde consultas complejas cero aprender sql puzzle

optimizacion - optimizar consultas sql oracle



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

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

Hay tal vez valores duplicados en la columna.


¿Algo como esto? 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


Como mencionaste valores duplicados. En tal caso, puede usar DISTINCT y GROUP BY para averiguar el segundo valor más alto

Aquí hay una tabla

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


Consulta para encontrar 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 Top 1 resaltado a TOP 2 , 3 o 4 puede encontrar el 3º, 4º y 5º más alto respectivamente.



El más simple de todos

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


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 tabla o exploración de índice que utiliza la agregación max .

Alternativamente, en Microsoft SQL 2005 y ROW_NUMBER() puede usar 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


Es la manera más esiestísima:

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


Esta es otra manera de encontrar el segundo valor más grande de una columna. Considere la tabla ''Estudiante'' y la columna ''Edad''. Luego 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


Esto funciona en MS SQL:

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


La vieja pregunta que 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


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



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 tu servidor de base de datos. Sugerencia: SQL Server no hace LIMIT.


También podemos hacer uso de ordenar por y el primer 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


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

Leve modificación a su consulta funcionará -

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** ( select max([COLUMN_NAME]) from [TABLE_NAME] )


Tratar:

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


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

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


Usando una consulta correlacionada:

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


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 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 ten cuidado con los que aceptas. 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

Actualizar:

SQL Server 2012 ahora admite una sintaxis OFFSET / FETCH mucho más limpia (y standard ):

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


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 para obtener el valor de cualquier fila .....


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


SELECT * FROM EMP WHERE salary= (SELECT MAX(salary) FROM EMP WHERE salary != (SELECT MAX(salary) FROM EMP) );


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


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.


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


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.


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 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 que no sean el más grande. seleccione el valor máximo de la lista devuelta.


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

Nota

sal es nombre col
emp es el nombre de la tabla


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