resueltos por numero empleados ejercicios ejemplos departamento consultas complejas sql sql-server tsql

ejercicios - numero de empleados por departamento sql



Consulta SQL para encontrar el N-ésimo salario más alto de una tabla de sueldos (11)

¿Cómo puedo encontrar el N-ésimo salario más alto en una tabla que contiene salarios en SQL Server?


El método más fácil es obtener el 2nd higest salary de la table en SQL :

sql> select max(sal) from emp where sal not in (select max(sal) from emp);


Manera simple SIN usar ninguna característica especial específica de Oracle, MySQL, etc. Suponga que en la tabla EMPLEADO se pueden repetir los sueldos. Utilice la consulta para averiguar el rango de cada ID.

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;


No te olvides de usar la palabra clave distinct : -

SELECT TOP 1 Salary FROM ( SELECT Distinct TOP N Salary FROM Salaries ORDER BY Salary DESC ) SalarySubquery ORDER BY Salary ASC


Podría usar row_number para elegir una fila específica. Por ejemplo, el 42 ° salario más alto:

select * from ( select row_number() over (order by Salary desc) as rn , * from YourTable ) as Subquery where rn = 42

Las funciones de ventana como row_number solo pueden aparecer en las cláusulas select or order by . La solución alternativa es colocar row_number en una subconsulta.


Puede usar una expresión de tabla común (CTE) para derivar la respuesta.

Digamos que tiene los siguientes salarios en la tabla Salarios:

EmployeeID Salary -------------------- 10101 50,000 90140 35,000 90151 72,000 18010 39,000 92389 80,000

Usaremos:

DECLARE @N int SET @N = 3 -- Change the value here to pick a different salary rank SELECT Salary FROM ( SELECT row_number() OVER (ORDER BY Salary DESC) as SalaryRank, Salary FROM Salaries ) as SalaryCTE WHERE SalaryRank = @N

Esto creará un número de fila para cada fila una vez que haya sido ordenado por el salario en orden descendente, luego recuperará la tercera fila (que contiene el tercer registro más alto).

Para aquellos de ustedes que no quieren un CTE (o están atrapados en SQL 2000):

[ Nota : esto funciona notoriamente peor que el ejemplo anterior; ejecutarlos uno al lado del otro con un plan de exceución muestra un costo de consulta del 36% para el CTE y del 64% para la subconsulta]:

SELECT TOP 1 Salary FROM ( SELECT TOP N Salary FROM Salaries ORDER BY Salary DESC ) SalarySubquery ORDER BY Salary ASC

donde N es definido por ti.

SalarySubquery es el alias que he dado a la subconsulta, o la consulta que está entre paréntesis.

Lo que hace la subconsulta es que selecciona los mejores sueldos de N (digamos 3 en este caso), y los ordena por el salario más alto.

Si queremos ver el tercer salario más alto, la subconsulta regresaría:

Salary ----------- 80,000 72,000 50,000

La consulta externa selecciona el primer salario de la subconsulta, excepto que lo estamos ordenando de forma ascendente esta vez, que ordena de menor a mayor, por lo que 50,000 sería el primer registro ordenado ascendente.

Como puede ver, 50,000 es de hecho el tercer salario más alto en el ejemplo.


Una consulta muy simple para encontrar el n-ésimo salario más alto

SELECT DISTINCT(Sal) FROM emp ORDER BY Salary DESC LIMIT n,1


intentalo...

use table_name select MAX(salary) from emp_salary WHERE marks NOT IN (select MAX(marks) from student_marks )


Solución 1: Este SQL para encontrar el N-ésimo salario más alto debería funcionar en SQL Server, MySQL, DB2, Oracle, Teradata y casi cualquier otro RDBMS: (nota: bajo rendimiento debido a la subconsulta)

SELECT * /*This is the outer query part */ FROM Employee Emp1 WHERE (N-1) = ( /* Subquery starts here */ SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > Emp1.Salary)

Lo más importante de entender en la consulta anterior es que la subconsulta se evalúa cada vez que una fila es procesada por la consulta externa. En otras palabras, la consulta interna no se puede procesar independientemente de la consulta externa ya que la consulta interna también usa el valor Emp1.

Para encontrar el N-ésimo salario más alto, solo encontramos el salario que tiene exactamente N-1 salarios mayores que él.

Solución 2: Encuentre el n-ésimo salario más alto utilizando la palabra clave TOP en SQL Server

SELECT TOP 1 Salary FROM ( SELECT DISTINCT TOP N Salary FROM Employee ORDER BY Salary DESC ) AS Emp ORDER BY Salary

Solución 3: Encuentre el enésimo salario más alto en SQL Server sin usar TOP

SELECT Salary FROM Employee ORDER BY Salary DESC OFFSET N-1 ROW(S) FETCH FIRST ROW ONLY

Tenga en cuenta que no he probado personalmente el SQL anterior, y creo que solo funcionará en SQL Server 2012 y posteriores.


EmpID Name Salary 1 A 100 2 B 800 3 C 300 4 D 400 5 E 500 6 F 200 7 G 600 SELECT * FROM Employee E1 WHERE (N-1) = ( SELECT COUNT(DISTINCT(E2.Salary)) FROM Employee E2 WHERE E2.Salary > E1.Salary )

Supongamos que desea encontrar el quinto salario más alto, lo que significa que hay un total de 4 empleados que tienen un salario mayor que el 5to empleado más alto. Por lo tanto, para cada fila de la consulta externa, verifique el número total de salarios que son mayores que el salario actual. La consulta externa funcionará primero para 100 y verificará el número de salarios mayor que 100. Será 6, no coincida (5-1) = 6 donde la cláusula de externalquery. Luego, para 800, y verifique el número de salarios superiores a 800, 4=0 falso, luego trabaje para 300 y, finalmente, hay 4 registros en la tabla que son mayores que 300. Por lo tanto, 4=4 cumplirá la cláusula where y regresará 3 C 300 .


SELECT * FROM (select distinct postalcode from Customers order by postalcode DESC) limit 4,1;

4 aquí significa salir primero 4 y mostrar el siguiente 1.

Prueba esto, me funciona.


select MIN(salary) from ( select top 5 salary from employees order by salary desc) x