Averigüe el n-ésimo salario más alto de la tabla

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

enter image description here

puedes ver en la captura de pantalla que está funcionando.

 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"

 select * from ( select sal, rank() over (order by sal DESC/ASC) rnk from emp ) where rnk = 1/2/3/4/5/6/...; 

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 performance 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 key 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 count 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 arguments 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; 

Consulta general para toda la database

 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 get 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 progtwigción

select * del order de jerarquía por salario

luego itere el set de resultados en el lenguaje de progtwigción (JAVA, .net o php)

Mysql

 SELECT DISTINCT salary FROM emp X order by salary desc limit n,1 

Ha labeldo su pregunta Oracle para que pueda usar la function NTH_VALUE() … desafortunadamente es una function analítica, pero su consulta se simplificaría a:

 select distinct nth_value(salary, 3) over () from employees 

SQL Fiddle

Desde 12c Oracle finalmente alcanza al rest 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 

DECLARE M INT; SET M = N-1; SELECCIONE DISTINTO Salario DE Empleado ORDEN POR Salario DESC LÍMITE M, 1;

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 ) 

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 …..

Consulte la siguiente consulta para get el n-ésimo salario más alto. De esta forma obtienes el n. ° salario más alto. Si quiere get el salario n-ésimo más bajo, solo necesita replace DESC por ASC en la consulta. para obtener el n ° el más alto

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; 

En el server Sql 2012 y superior. Por favor, consulte este enlace para get Fetch, Offset, página de server 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) 

Mira aquí

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