2010-10-03 143 views

Respuesta

33

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

Digamos que usted tiene los siguientes salarios en los sueldos de mesa:

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

vamos a utilizar:

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 después de que ha sido ordenado por el Salario en orden descendente, luego recupera 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 realiza notablemente peor que el ejemplo anterior; ejecutarlos de lado a lado con una planes exceution muestra un coste de consulta de 36% para el CTE y 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 se define 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 seleccionar los mejores sueldos de N (digamos en este caso), y los ordena por el mayor salario.

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

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

La consulta externa a continuación, selecciona el primer sueldo de la subconsulta, excepto que estamos arreglármelo ascendente este tiempo, 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.

+0

esta parte está claro que me podría u explicármelo SalarySubquery ORDER BY ASC Salario – NoviceToDotNet

+0

@NoviceToDotNet - He editado mi respuesta en función de sus comentarios. Espero que aclaren las cosas. – LittleBobbyTables

+0

@LittleBobbyTables: He editado tu respuesta - parte CTE. Si es correcto, acepte amablemente los cambios; de lo contrario, corrígeme. –

12

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

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

Las funciones de división como row_number sólo puede aparecer en select o order by cláusulas. La solución alternativa es colocar el row_number en una subconsulta.

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

Creo que es el más simple. ¡¡buen trabajo!! – himanshupareek66

1

manera simple sin utilizar ninguna característica especial específica para Oracle, MySQL, etc. Supongamos que en sueldos tabla de empleados se pueden repetir. Utilice la consulta para buscar 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 nos enteramos de distintos sueldos. 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. Así que '+1' se hace para iniciar el rango de 1.

Ahora podemos obtener identificadores 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; 
2

probarlo ...

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

muy simple consulta para encontrar enésima salario más alto

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

Esto está etiquetado como ** [sql-server] **; SQL Server no tiene la palabra clave LIMIT – LittleBobbyTables

0

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

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

No se olvide de utilizar 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 
2
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 
      ) 

Suponga que desea encontrar quinto salario más alto, lo que significa que hay un total de 4 empleados que tienen sueldos superiores a quinto más alto de los empleados. 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 verifique el número de salarios mayor que 100. Será 6, no coincida con (5-1) = 6 donde la cláusula de externalquery. Luego, para 800, y verifique el número de salarios mayor que 800, 4=0 falso, entonces trabaje para 300 y finalmente hay 4 registros en la tabla que son mayores que 300. Por lo tanto, 4=4 cumplirá con la cláusula where y devolverá 3 C 300.

0

Solución 1: Esta SQL para encontrar el salario enésima 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: Encuentra el salario más alto enésima usando 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: Encuentra el salario más alto de orden n en SQL Server sin utilizar 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.

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

4 aquí significa dejar primero 4 y mostrar la siguiente 1.

Prueba esto funciona para mí.

+0

Postalcode aquí es el nombre de la columna y Customers es el nombre de la tabla. –

Cuestiones relacionadas