最近在一次采访中,我被要求写一个查询,我必须从表中获取第n个最高工资而不使用TOP和任何子查询?
我完全感到困惑,因为我知道实现它的唯一方法是使用TOP和子查询。
请提供解决方案。
提前致谢。
答案 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,第二高。