todos tiene salarios salario resueltos que promedio por numero muestre manager_id los king empleados empleado ejercicios ejemplos dependen departamento cuantos cual consultas cada bajo apellido sql sql-server tsql optimization

sql - tiene - Cómo obtener el segundo mejor salario en una mesa



numero de empleados por departamento sql (30)

¿Podemos también usar

select e2.max(sal), e2.name from emp e2 where (e2.sal <(Select max (Salary) from empo el)) group by e2.name

Por favor, hágamelo saber lo que está mal con este enfoque

Es una pregunta que tengo esta tarde:

Allí, una tabla contiene ID, Nombre y Salario de empleados, obtener nombres de los empleados con el segundo salario más alto, en SQL Server

Aquí está mi respuesta, lo acabo de escribir en papel y no estoy seguro de que sea perfectamente válido, pero parece funcionar:

SELECT Name FROM Employees WHERE Salary = ( SELECT DISTINCT TOP (1) Salary FROM Employees WHERE Salary NOT IN (SELECT DISTINCT TOP (1) Salary FROM Employees ORDER BY Salary DESCENDING) ORDER BY Salary DESCENDING)

Creo que es feo, pero es la única solución que se me viene a la mente.

¿Me puede sugerir una mejor consulta?

Muchas gracias.


¿Qué tal un CTE?

;WITH Salaries AS ( SELECT Name, Salary, DENSE_RANK() OVER(ORDER BY Salary DESC) AS ''SalaryRank'' FROM dbo.Employees ) SELECT Name, Salary FROM Salaries WHERE SalaryRank = 2

DENSE_RANK() le dará todos los empleados que tienen el segundo salario más alto, sin importar cuántos empleados tengan el salario más alto (idéntico).


Aquí hay un enfoque simple:

select name from employee where salary=(select max(salary) from(select salary from employee minus select max(salary) from employee));


Aquí utilicé dos consultas para los siguientes escenarios que se solicitan durante una entrevista
Primer escenario:
Encuentre el segundo salario más alto en la tabla (Segundo salario más alto con más de un empleado)

select * from emp where salary In (select MAX(salary) from emp where salary NOT IN (Select MAX(salary) from emp));

Segundo escenario:
Encuentra solo el segundo salario más alto en la tabla

select min(temp.salary) from (select * from emp order by salary desc limit 2) temp;


Creando una tabla temporal

Create Table #Employee (Id int identity(1,1), Name varchar(500), Salary int)

Insertar datos

Insert Into #Employee Select ''Abul'', 5000 Union ALL Select ''Babul'', 6000 Union ALL Select ''Kabul'', 7000 Union ALL Select ''Ibul'', 8000 Union ALL Select ''Dabul'', 9000

La consulta será

select top 1 * from #Employee a Where a.id <> (Select top 1 b.id from #Employee b ORDER BY b.Salary desc) order by a.Salary desc

Mesa plegable

drop table #Empoyee


Creo que esto es probablemente el más simple del montón.

SELECT Name FROM Employees group BY Salary DESCENDING limit 2;


Creo que le gustaría usar DENSE_RANK ya que no sabe cuántos empleados tienen el mismo salario y dijo que quería nombres de empleados.

CREATE TABLE #Test ( Id INT, Name NVARCHAR(12), Salary MONEY ) SELECT x.Name, x.Salary FROM ( SELECT Name, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) as Rnk FROM #Test ) x WHERE x.Rnk = 2

ROW_NUMBER te da una numeración única, incluso si los salarios están vinculados, y el RANK simple no te daría un ''2'' como rango si tuvieras varias personas empatando por el salario más alto. Lo he corregido porque DENSE_RANK hace el mejor trabajo para esto.


Debajo de la consulta puede usarse para encontrar el enésimo valor máximo, simplemente reemplace 2 del enésimo número

select * from emp e1 where 2 =(select count(distinct(salary)) from emp e2 where e2.emp >= e1.emp)


Esto podría ayudarte

SELECT MIN(SALARY) FROM EMP WHERE SALARY in (SELECT DISTINCT TOP 2 SALARY FROM EMP ORDER BY SALARY DESC)

podemos encontrar cualquier nth salario más alto poniendo ''n'' (n > 0) en lugar de ''2''

ejemplo para el quinto salario más alto que ponemos n = 5


Manera simple SIN usar ninguna característica especial específica de Oracle, MySQL, etc.

Supongamos que la tabla EMPLOYEE tiene datos como a continuación. Los sueldos se pueden repetir.

Por análisis manual podemos decidir los rangos de la siguiente manera:

El mismo resultado se puede lograr mediante consulta

select * from ( select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from EMPLOYEE ) where distsal >tout.sal) as rank from EMPLOYEE tout ) result order by rank

Primero descubrimos salarios distintos. Luego descubrimos el recuento de salarios distintos superiores a cada fila. Esto no es más que el rango de esa identificación. Para el salario más alto, este conteo será cero. Entonces ''+1'' se hace para comenzar el rango desde 1.

Ahora podemos obtener identificaciones en el N ° rango agregando la cláusula where a la consulta anterior.

select * from ( select tout.sal, id, (select count(*) +1 from (select distinct(sal) distsal from EMPLOYEE ) where distsal >tout.sal) as rank from EMPLOYEE tout ) result where rank = N;


Otra forma intuitiva es: - Supongamos que queremos encontrar el N-ésimo salario más alto

1) Clasificar Empleado según el orden descendente de salario

2) Tome los primeros N registros usando rownum. Entonces, en este paso, el n. ° registro aquí es el N-ésimo salario más alto

3) Ahora ordena este resultado temporal en orden ascendente. Así, el N-ésimo salario más alto es ahora el primer registro

4) Obtenga el primer registro de este resultado temporal.

Será el N-ésimo salario más alto.

select * from (select * from (select * from (select * from emp order by sal desc) where rownum<=:N ) order by sal ) where rownum=1;

En caso de que haya sueldos que se repiten, en la consulta más interna se puede usar distinto.

select * from (select * from (select * from (select distinct(sal) from emp order by 1 desc) where rownum<=:N ) order by sal ) where rownum=1;


Para obtener los nombres de los empleados con el segundo monto salarial distinto más alto que puede usar.

;WITH T AS ( SELECT *, DENSE_RANK() OVER (ORDER BY Salary Desc) AS Rnk FROM Employees ) SELECT Name FROM T WHERE Rnk=2;

Si el salario se indexa, lo siguiente puede ser más eficiente, especialmente si hay muchos empleados.

SELECT Name FROM Employees WHERE Salary = (SELECT MIN(Salary) FROM (SELECT DISTINCT TOP (2) Salary FROM Employees ORDER BY Salary DESC) T);

Script de prueba

CREATE TABLE Employees ( Name VARCHAR(50), Salary FLOAT ) INSERT INTO Employees SELECT TOP 1000000 s1.name, abs(checksum(newid())) FROM sysobjects s1, sysobjects s2 CREATE NONCLUSTERED INDEX ix ON Employees(Salary) SELECT Name FROM Employees WHERE Salary = (SELECT MIN(Salary) FROM (SELECT DISTINCT TOP (2) Salary FROM Employees ORDER BY Salary DESC) T); WITH T AS (SELECT *, DENSE_RANK() OVER (ORDER BY Salary DESC) AS Rnk FROM Employees) SELECT Name FROM T WHERE Rnk = 2; SELECT Name FROM Employees WHERE Salary = (SELECT DISTINCT TOP (1) Salary FROM Employees WHERE Salary NOT IN (SELECT DISTINCT TOP (1) Salary FROM Employees ORDER BY Salary DESC) ORDER BY Salary DESC) SELECT Name FROM Employees WHERE Salary = (SELECT TOP 1 Salary FROM (SELECT TOP 2 Salary FROM Employees ORDER BY Salary DESC) sel ORDER BY Salary ASC)



Pruebe esto para obtener el salario n-ésimo más alto.

SELECT * FROM emp e1 WHERE 2 = ( SELECT COUNT(salary) FROM emp e2 WHERE e2.salary >= e1.salary )


Quiero publicar aquí posiblemente la solución más fácil. Funcionó en mysql.

Por favor, compruebe en su extremo también:

SELECT name FROM `emp` WHERE salary = ( SELECT salary FROM emp e ORDER BY salary DESC LIMIT 1 OFFSET 1


Si desea mostrar el nombre del empleado que recibe el segundo salario más alto, utilice esto:

SELECT employee_name FROM employee WHERE salary = (SELECT max(salary) FROM employee WHERE salary < (SELECT max(salary) FROM employee);


Usando este SQL, el segundo salario más alto se obtendrá con el nombre del empleado

Select top 1 start at 2 salary from employee group by salary order by salary desc;


esta es la consulta simple ... si desea el segundo mínimo, simplemente cambie el máximo a mínimo y cambie el signo menor que (<) a rallador que (>).

select max(column_name) from table_name where column_name<(select max(column_name) from table_name)


intenta de esta manera simple

select name,salary from employee where salary = (select max(salary) from employee where salary < (select max(salary) from employee ))


Prueba esto : esto dará resultados dinámicos independientemente de que no haya filas

SELECT * FROM emp WHERE salary = (SELECT max(e1.salary) FROM emp e1 WHERE e1.salary < (SELECT Max(e2.salary) FROM emp e2))**


SELECT * from Employee WHERE Salary IN (SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FFROM employee));

Intenta así ..


- Method 1 select max(salary) from Employees where salary< (select max(salary) from Employees) - Method 2 select MAX(salary) from Employees where salary not in(select MAX(salary) from Employees) - Method 3 select MAX(salary) from Employees where salary!= (select MAX(salary) from Employees )


SELECT * FROM TABLE1 AS A WHERE NTH HIGHEST NO.(SELECT COUNT(ATTRIBUTE) FROM TABLE1 AS B) WHERE B.ATTRIBUTE=A.ATTRIBUTE;


SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee)


SELECT `salary` AS emp_sal, `name` , `id` FROM `employee` GROUP BY `salary` ORDER BY `salary` DESC LIMIT 1 , 1


SELECT name FROM employee WHERE salary = (SELECT MIN(salary) FROM (SELECT TOP (2) salary FROM employee ORDER BY salary DESC) )


declare cntr number :=0; cursor c1 is select salary from employees order by salary desc; z c1%rowtype; begin open c1; fetch c1 into z; while (c1%found) and (cntr <= 1) loop cntr := cntr + 1; fetch c1 into z; dbms_output.put_line(z.salary); end loop; end;


select * from emp where salary = ( select salary from (select ROW_NUMBER() over (order by salary) as ''rownum'', * from emp) t -- Order employees according to salary where rownum = 2 -- Get the second highest salary )


select MAX(Salary) from Employee WHERE Salary NOT IN (select MAX(Salary) from Employee );


select max(age) from yd where age<(select max(age) from HK) ; /// True two table Highest SELECT * FROM HK E1 WHERE 1 =(SELECT COUNT(DISTINCT age) FROM HK E2 WHERE E1.age < E2.age); ///Second Hightest age RT single table select age from hk e1 where (3-1) = (select count(distinct (e2.age)) from yd e2 where e2.age>e1.age);//// same True Second Hight age RT two table select max(age) from YD where age not in (select max(age) from YD); //second hight age in single table