una tabla sentencias resueltos por numero empleados ejercicios ejemplos ejemplo departamento crear consultas complejas como sql oracle11g greatest-n-per-group

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

SQL Fiddle

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)

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