Sql 如何在不使用TOP和sub查询的情况下从表中获取第n个最高工资?
最近在一次采访中,我被要求写一个查询,我必须在不使用TOP和任何子查询的情况下从表中获取第n个最高工资 我完全弄糊涂了,因为我知道实现它的唯一方法是同时使用TOP和sub查询 请提供其解决方案Sql 如何在不使用TOP和sub查询的情况下从表中获取第n个最高工资?,sql,sql-server,sql-server-2005,sql-server-2008,Sql,Sql Server,Sql Server 2005,Sql Server 2008,最近在一次采访中,我被要求写一个查询,我必须在不使用TOP和任何子查询的情况下从表中获取第n个最高工资 我完全弄糊涂了,因为我知道实现它的唯一方法是同时使用TOP和sub查询 请提供其解决方案 提前感谢。尝试CTE-通用表表达式: WITH Salaries AS ( SELECT SalaryAmount, ROW_NUMBER() OVER(ORDER BY SalaryAmount DESC) AS 'RowNum' FROM dbo.Sal
提前感谢。尝试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
这将把你的薪水分成10组,每组人数相等,而NTile=1的那一组是薪水的前10%
;with cte as(
Select salary,
row_number() over (order by salary desc) as rn
from salaries
)
select salary
from cte
where rn=@n
如果您想要第n个不同的薪资金额,也可以使用密集等级代替行数试试这个
Select *
From Employee E1
Where
N = (Select Count(Distinct(E2.Salary)) From Employee E2 Where E2.Salary >= E1.Salary)
SELECT * FROM
(SELECT Salary,
rownum AS roworder
FROM (select distinct Salary from employer)
ORDER BY Salary
)
where roworder = 6
;
它可以简单地做如下第二高-
Select MAX(Salary) from employer where Salary NOT IN(Select MAX(Salary) from employer);
但是对于第n个最高值,我们必须使用CTECommon表表达式。如果 三万, 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
使用ms sql server的最高sal: 从emp中选择sal,其中sal=从emp中选择maxsal 第二高的sal:
从emp中选择maxsal,其中sal不在emp中选择maxsal。使用CTE可以很容易地找到第n个等级的项目 **
**如果我们被要求在没有行号、等级、密集等级和子查询的情况下查找第n个最高工资,该怎么办 希望下面的查询能有所帮助 从[dbo].[Test]中选择*按薪资说明排序
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,第二高。显示第5分钟Sal Emp表
要查找第n个最高工资,请执行以下操作: 表名-Emp
emplyee_id salary
1 2000
2 3000
3 5000
4 8000
5 7000
6 2000
7 1000
sql查询->此处N是要查找的最高工资:
select salary from (select salary from Emp order by salary DESC LIMIT N) AS E order by ASC LIMIT 1;
这将在oracle中起作用为了找到第N个最高工资,我们只考虑唯一的工资。最高工资意味着没有工资高于它,第二高工资意味着只有一个工资高于它,第三高工资意味着两个工资高于它,同样,第N高工资意味着N-1个工资高于它。 您可以使用LIMIT关键字,它提供分页 功能。您可以执行以下操作:
SELECT salary FROM Employee ORDER BY salary DESC LIMIT N-1, 1
例:MySQL中无子查询的第二高工资:
SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1
6-写第二高工资的方法..** 1.按薪资说明从员工订单中选择*抵销1行仅取下1行
2.从工资所在的员工中选择maxsalary如果有三种工资:10、20和20,哪个是第二高的?是因为前两名都是20岁吗?还是10是因为20是最高的,10是次高的?换句话说,你想拿到第n个最高的薪水还是第n个最高的薪水?有趣的是,面试官说了这个子问题。我想说的是,它是TOP DESC/TOP ASC的派生表solution@Mark期望的结果是第n个最高工资。然后看看稠密等级+1,因为这确实有效,但等级函数更有效。此外,它显然使用了子查询,但我不确定这个问题是指不使用TOP还是子查询。因为有明显的区别,这相当于密集的秩而不是行数。问题还不是很清楚哪一个更合适,所以可能也没问题。@Venktesh我在找这个,请解释where子句子查询是如何工作的。问题是不使用子查询这在SQL Server中是无效的。先生……在第一个解决方案中,为什么我们不在cte函数中使用Partition by子句。?@Akhilessingh:因为没有要求为每个内容显示前n。OP只是想要在所有薪水中排名第n位,而不是在某个特定群体中排名第n位,每个国家、每个职业或类似的东西排名第n位。我明白了……谢谢uu:
emplyee_id salary
1 2000
2 3000
3 5000
4 8000
5 7000
6 2000
7 1000
select salary from (select salary from Emp order by salary DESC LIMIT N) AS E order by ASC LIMIT 1;
SELECT salery,name
FROM employ
ORDER BY salery DESC limit 1, OFFSET n
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;
SELECT salary FROM Employee ORDER BY salary DESC LIMIT N-1, 1
SELECT salary FROM Employee ORDER BY salary DESC LIMIT 1,1