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