sql - sentencias - Averigüe el n-ésimo salario más alto de la tabla
numero de empleados por departamento sql (14)
name salary
----- -----
mohan 500
ram 1000
dinesh 5000
hareesh 6000
mallu 7500
manju 7500
praveen 10000
hari 10000
¿Cómo encontraría el n-ésimo salario más alto de la tabla antes mencionada usando Oracle?
puedes usar algo como esto ... esto es lo que he probado y luego pegado aquí
SELECT *
FROM tblname
WHERE salary = (SELECT *
FROM (SELECT *
FROM (SELECT *
FROM (SELECT DISTINCT( salary )
FROM tblname
ORDER BY salary DESC) A
WHERE rownum <= nth) B
ORDER BY salary ASC) C
WHERE rownum <= 1)
en lugar de ''tblname'' escriba el nombre de su tabla y luego colóquelo en su lugar n déjele el salario más alto deseado que desee
puedes ver en la captura de pantalla que está funcionando.
En MySql, ejecute el siguiente SQL para encontrar el n-ésimo salario más alto:
SELECT distinct(salary), emp_id, name
FROM `emp_salary`
group by salary
order by salary desc limit N-1,1;
Por ejemplo, encuentre el tercer salario más alto:
SELECT distinct(salary), emp_id, name
FROM `emp_salary`
group by salary
order by salary desc limit 2,1;
Por ejemplo, encuentre el tercer salario más bajo (haga "pedido por asc"):
SELECT distinct(salary), emp_id, name
FROM `emp_salary`
group by salary
order by salary asc limit 2,1;
Ha etiquetado su pregunta Oracle para que pueda usar la función NTH_VALUE()
... desafortunadamente es una función analítica, pero su consulta se simplificaría a:
select distinct nth_value(salary, 3) over ()
from employees
Desde 12c Oracle finalmente se pone al día con el resto del mundo e incluye OFFSET para que puedas usar esto en su lugar:
select salary
from employees
order by salary
offset n - 1
fetch next row only
Puedes encontrar muchas cosas en google
select *
from table_name T1
where Nth = (select count(distinct (T2.sal))
from table_name T2
where T1.sal <= T2.sal )
Consulta general para toda la base de datos
SELECT DISTINCT salary FROM emp X WHERE n =
( SELECT COUNT(DISTINCT salary) FROM emp WHERE salary >=X.salary )
Reemplace n con el número dado. por ejemplo, para obtener el tercer salario más alto
SELECT DISTINCT salary FROM emp X WHERE 3 =
( SELECT COUNT(DISTINCT salary) FROM emp WHERE salary >=X.salary )
O
en cualquier lenguaje de programación
seleccione * del orden de jerarquía por salario
luego itere el conjunto de resultados en el lenguaje de programación (JAVA, .net o php)
Mysql
SELECT DISTINCT salary FROM emp X order by salary desc limit n,1
select *
from ( select s.*, rank() over (order by salary desc) as rownumber
from salary )
where rownumber = nth
pase su número de sueldo en lugar de "enésimo"
Seleccione n-ésimo salario más alto de una manera simple
SELECT emp_no, sal
FROM
(
select emp_no, sal, ROW_NUMBER() OVER (order by sal desc) RN
from emp
order by sal desc
)
WHERE RN = n;
Donde n = el n-ésimo número que quieres .....
Este artículo habla sobre esta cuestión en profundidad, y citaré el código a continuación: (Nota: vea las 2 soluciones inferiores para Oracle)
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.
Solución 4: funciona en MySQL
SELECT Salary FROM Employee
ORDER BY Salary DESC LIMIT n-1,1
La cláusula LIMIT toma dos argumentos en esa consulta: el primer argumento especifica el desplazamiento de la primera fila a devolver, y el segundo especifica el número máximo de filas a devolver.
Solución 5: funciona en Oracle
select * from (
select Emp.*,
row_number() over (order by Salary DESC) rownumb
from Employee Emp
)
where rownumb = n; /*n is nth highest salary*/
Solución 6: funciona en Oracle way 2
select * FROM (
select EmployeeID, Salary
,rank() over (order by Salary DESC) ranking
from Employee
)
WHERE ranking = N;
select * from
(
select sal, rank() over (order by sal DESC/ASC) rnk
from emp
)
where rnk = 1/2/3/4/5/6/...;
Consulte la siguiente consulta para obtener el n-ésimo salario más alto. De esta manera obtienes el n. ° salario más alto. Si quiere obtener el salario n-ésimo más bajo, solo necesita reemplazar DESC por ASC en la consulta.
DECLARE M INT; SET M = N-1; SELECCIONE DISTINTO Salario DE Empleado ORDEN POR Salario DESC LÍMITE M, 1;
En el servidor Sql 2012 y superior. Por favor, consulte este enlace para obtener Fetch, Offset, página de servidor Sql
Use AdventureWorks /* AdventureWorks 2014 DB*/
Select distinct(CommissionPct) from Sales.SalesPerson
order by CommissionPct desc OffSet 3 Rows Fetch next 1 Rows only
--This for 4Th highest value (N-1)
Pruebe seguir en Oracle:
SELECT *
FROM
(SELECT rownum AS rn,
a.*
FROM
(WITH DATA AS -- creating dummy data
( SELECT ''MOHAN'' AS NAME, 200 AS SALARY FROM DUAL
UNION ALL
SELECT ''AKSHAY'' AS NAME, 500 AS SALARY FROM DUAL
UNION ALL
SELECT ''HARI'' AS NAME, 300 AS SALARY FROM DUAL
UNION ALL
SELECT ''RAM'' AS NAME, 400 AS SALARY FROM DUAL
)
SELECT D.* FROM DATA D ORDER BY SALARY DESC
) A
)
WHERE rn = 3; -- specify N''th highest here (In this case fetching 3''rd highest)
¡Aclamaciones!
Podemos hacer esto por subconsulta correlacionada.
SELECT Salary
FROM Employee E1
WHERE N-1 = (SELECT COUNT(*)
FROM Employee E2
WHERE E1.salary <E2.Salary)
Para más información, consulte este enlace. Subconsulta correlacionada con el ejemplo