如何在不使用TOP和子查询的情况下从表中获取第n个最高薪水?

时间:2010-09-05 08:54:34

标签: sql sql-server sql-server-2005 sql-server-2008

最近在一次采访中,我被要求写一个查询,我必须从表中获取第n个最高工资而不使用TOP和任何子查询?

我完全感到困惑,因为我知道实现它的唯一方法是使用TOP和子查询。

请提供解决方案。

提前致谢。

17 个答案:

答案 0 :(得分:10)

尝试CTE - 通用表格表达式:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   RowNum <= 5

这将按降序排列前5名工资 - 您可以使用RowNumn值进行游戏,并基本上从工资列表中检索任何切片。

SQL Server中有other ranking functions可供使用 - 例如有NTILE会将你的结果分成相同大小的n组(尽可能接近),所以你可以例如像这样创建10个组:

WITH Salaries AS
(
    SELECT 
       SalaryAmount, NTILE(10) OVER(ORDER BY SalaryAmount DESC) AS 'NTile'
    FROM 
       dbo.SalaryTable
)
SELECT
  SalaryAmount
FROM
  Salaries
WHERE
   NTile = 1

这会将你的工资分成10个相同大小的组 - 而NTile=1组的工资是“TOP 10%”工资组。

答案 1 :(得分:9)

;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)

select salary 
from cte 
where rn=@n

(或者,如果您想要第n个最高的不同工资金额,请使用dense_rank代替row_number

答案 2 :(得分:5)

Select  * 
From    Employee E1 
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)

答案 3 :(得分:3)

with cte as(
select VendorId,IncomeDay,IncomeAmount,
Row_Number() over ( order by IncomeAmount desc) as RowNumber
 from DailyIncome 
 )

 select * from cte
 where RowNumber=2

答案 4 :(得分:1)

试试这个。使用CTE可以很容易地找到第n级项目 **

with result AS
( 
 SELECT  *,dense_rank() over( order by Salary) as ranks FROM Employee
) 
select *from RESULT Where ranks = 2

**

答案 5 :(得分:1)

找到第N个最高薪水:
表名 - Emp

        emplyee_id     salary
             1          2000
             2          3000
             3          5000
             4          8000
             5          7000
             6          2000
             7          1000

sql query - &gt;这里N是最高薪水:

select salary from (select salary from Emp order by salary DESC LIMIT N) AS E order by ASC LIMIT 1;

答案 6 :(得分:1)

显示5th Min Sal Emp Table。

ProjectExplorer

答案 7 :(得分:1)

如果有重复的

条目

30000,
23,000
23,000
15,000,
14800

然后上面的选定查询将不会返回正确的输出。

找到正确的查询,如下所示:

with salaries as
(
    select Salary,DENSE_RANK() over (order by salary desc) as 'Dense' 
    from Table_1
)
select distinct salary from salaries
where dense=3

答案 8 :(得分:1)

它可以简单地完成以下第二高 -

Select MAX(Salary) from employer where Salary NOT IN(Select MAX(Salary) from employer);

但是对于Nth最高,我们必须使用CTE(Common Table Expression)。

答案 9 :(得分:1)

试试这个。

 SELECT * FROM
  (SELECT Salary,
    rownum AS roworder
  FROM (select distinct Salary from employer)
  ORDER BY Salary
  )
 where roworder = 6
  ;

答案 10 :(得分:0)

 SELECT salery,name
 FROM employ
 ORDER BY salery DESC limit 1, OFFSET n

答案 11 :(得分:0)

with CTE_name (salary,name)
AS
( row_num() over (order by desc salary) as num from tablename )
select salary, name from CTE_name where num =1;

这将在oracle中运行

答案 12 :(得分:0)

为了找到第N个最高工资,我们只考虑独特的工资。最高工资意味着没有工资高于它,第二高意味着只有一个工资高于它,第三高意味着两个工资高于它,同样,第N个最高工资意味着N-1的工资高于它。 好吧,你可以使用 LIMIT 关键字,它提供分页 你可以这样做:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT N-1, 1 

Ex:没有子查询的MySQL中第二高的薪水:

SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1

答案 13 :(得分:0)

6种写第二高薪水的方法。**

1.select员工订单中的*按薪水描述偏移1行仅获取下1行

2。从员工那里选择最高(薪水),其中工资<(从员工那里选择最高(薪水))

3。从员工那里选择MAX(薪水)薪水不在(从Employee中选择MAX(薪水))

4。从员工e1,员工e2中选择max(e1.salary),其中e1.salary

5。cte as( SELECT *,ROW_NUMBER()OVER(由SALARY desc排序)以ROWNUM从EMPLOYEE中作为RN) 选择* From cte,其中ROWNUM = 2

6。从Employee e1,Employee e2中选择max(e1.Salary),其中e1.Salary

答案 14 :(得分:0)

使用 NTILE 函数获得第 n 个最高工资的正确方法。

SELECT DISTINCT SAL INTO #TEMP_A FROM EMPLOYEE 

DECLARE @CNT INT

SELECT @CNT=COUNT(1) FROM #TEMP_A

;WITH RES
AS(
SELECT SAL,NTILE(@CNT) OVER (ORDER BY SAL DESC) NTL
FROM #TEMP_A )

SELECT SALFROM RES WHERE NTL=3

DROP TABLE #TEMP_A

答案 15 :(得分:-1)

使用ms sql server的最高级别:

select sal from emp where sal=(select max(sal) from emp)

第二高的sal:

select max(sal) from emp where sal not in (select max(sal) from emp)

答案 16 :(得分:-2)

如果我们需要在没有Row_Number,Rank,Dense Rank和Sub Query的情况下找到第N个最高工资怎么办?

希望以下查询帮助。

从[dbo]中选择*。[测试]按工资描述顺序

Emp_Id  Name    Salary  Department
 4      Neelu   10000   NULL
 2      Rohit   4000    HR
 3      Amit    3000    OPS
 1      Rahul   2000    IT



select B.Salary from TEst B join Test A
on B.Salary<=A.Salary 
group by (B.Salary)
having count(B.salary)=2

结果: - 4000,第二高。