Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在不使用TOP和sub查询的情况下从表中获取第n个最高工资?_Sql_Sql Server_Sql Server 2005_Sql Server 2008 - Fatal编程技术网

Sql 如何在不使用TOP和sub查询的情况下从表中获取第n个最高工资?

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

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

我完全弄糊涂了,因为我知道实现它的唯一方法是同时使用TOP和sub查询

请提供其解决方案


提前感谢。

尝试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