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)
Prueba este
select * from
(
select name,salary,ROW_NUMBER() over( order by Salary desc) as
rownum from employee
) as t where t.rownum=2
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