3

我指的是以下查询来查找员工的第 N 高薪水。

select sal from emp t where &n = (select count(sal) from (select distinct sal 
 from emp) where t.sal<=sal);

一位绅士说这个查询有效。有人可以解释一下如何将 COUNT (实际上将在 1 到 X 之间的值,其中 X 是不同的工资总额)等同于 &n 产生这个结果吗?

我试图了解数据库如何在内部处理此查询并产生结果?

谢谢你。

4

11 回答 11

8

首先,查询将返回nth 最低工资值。要返回nth最高工资值,您必须更改t.sal <= salt.sal >= sal

接下来,此查询首先将不同的工资值列表查找为一个派生表,然后确定工资低于该列表中每个人的员工数量。t.sal <= sal正在获取派生表(大多数数据库需要一个别名)并将每个值与外部emp表进行比较。应该注意的是,在平局的情况下,这将返回多行。

要手动跟踪输出,我们需要一些输入:

Alice       | 200
Bob         | 100
Charlie     | 200
Danielle    | 150

Select Distinct sal
From emp

给我们

200
100
150

现在我们分析外表中的每一行

Alice - There are 3 distinct salary values less than or equal to 200
Bob - 1 rows <= 100
Charlie - 3 rows <= 200
Danielle - 2 row <= 150

因此,对于每个工资值,我们得到以下计数(并按计数重新排序):

Bob 1
Danielle 2
Charlie 3
Alice 3

我认为您忽略的最重要方面是外部emp内部计数计算相关(这就是为什么它被称为相关子查询)。即,对于外部emp表中的每一行,通过 为该行的薪水计算一个新计数t.sal <= sal。同样,大多数数据库系统都需要最内部的查询具有这样的别名(注意As Z别名):

Select sal
From emp As t
Where &n =  (
            Select Count(Z.sal)
            From    (
                    Select Distinct sal
                    From emp
                    ) As Z
            Where t.sal <= Z.sal
            )
于 2012-05-08T04:17:05.843 回答
1

要获得第 n 个最高工资值,只需输入“N”的值。

Select Min(Salary) From (Select Top N * From Table_Name Order by Salary Desc);
于 2013-05-31T22:05:45.830 回答
1
select sal 
from (
  select sal, 
         dense_rank() over (order by sal desc) as rnk
) t
where rnk = 5;

where rnk = 5用你想要的任何“nth”替换。

于 2013-05-31T22:51:04.763 回答
0
  SELECT Max(Salary) as Salary
    FROM employee
    where  Salary Not in 
    (SELECT TOP N Salary FROM employee ORDER BY Salary DESC)
  where N is defined by you.

因此,假设您在表employee 中有以下薪水: 这里employeeID 和Salary 是employee 表的列。

员工身份证工资

 101  25,000
 154  89,000
 987  42,000
 450  12,000
 954  50,000

如果我们想看到第四高的薪水

薪水

25,000

查询返回第四高的薪水。

于 2013-06-04T11:09:42.313 回答
0
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC) a
ORDER BY salary
where n > 1 (n is always
于 2013-06-13T06:39:22.487 回答
0

在数据库中记录数据条目,如

employ_id    NAME     salary
101          Henry    24000
102          Smith    24000
105          Roy      17000  
106          Robbin   15000 
702          Mac      2500
708          Bill     2100
709          Kane     2000
710          Ted      2000

这里有些员工的薪水相同,那么如何计算第n个(最高/最低)薪水

用于计算第三高薪水

select * from emloyees where salary in (select salary from (select rownum rank , salary from (select distinct salary from employees order by salary **desc**)) where rank =3;

ans = 15000

类似于计算第三低的薪水 键入相同的查询并进行少量更改而不是 desc 键入 asc

select * from emloyees where salary in (select salary from (select rownum rank , salary from (select distinct salary from employees order by salary **asc**)) where rank =3;

希望对你有帮助

于 2013-09-03T07:25:14.800 回答
0

更改第 n 个最高工资值,只需输入 'N' 的值

SELECT e1.EmployeeName, e1.EmployeeSalary from Employee e1
where N = (
select COUNT(e2.EmployeeSalary) from Employee e2 where e2.EmployeeSalary >= e1.EmployeeSalary)
于 2014-01-08T16:53:04.400 回答
0

有很多方法可以实现这一点:-

1)

 Select Top(1) sal from emp 
    where sal not in (select DISTINCT top(n-1) sal from emp order by sal desc)

2)

select salary     
          from (
           select salary,
           roe_number() over (order by salary ) as row from emp
          ) emp1
  where row= n;
  • 如果多行一个接一个地具有相同的值,则此查询将不起作用。

3)

select salary     
              from (
               select salary,
               dense_rank() over (order by salary ) as row from emp
              ) emp1
      where row= n;
  • 这将为所有唯一的工资金额创建一个唯一的行号。

4)

 Select Min(sal) From 
       (Select DISTINCT Top n * From emp Order by sal Desc)as emp1;

5)

   SELECT * FROM emp Emp1
            WHERE (n-1) = (
                             SELECT COUNT(DISTINCT(Emp2.Sal))
                             FROM emp Emp2
                             WHERE Emp2.Sal > Emp1.Sal)
于 2014-12-03T05:36:58.853 回答
0
select salary 
from (Select ROW_NUMBER() over(order by salary desc) as row ,salary from Employee)as temp
where row=2; 
---2nd highest salary
于 2021-03-27T13:07:44.710 回答
0

n 捐赠为您想要的第 n 个号码。喜欢:我想要第二高,所以我的查询将是 n=2

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

用你的号码替换 n

SELECT salary FROM Employee ORDER BY Salary DESC LIMIT n-1,1
于 2021-08-24T04:25:08.757 回答
-1

询问:

select 
    ename  
    ,sal  
    ,dense_rank() over (order by sal desc) ranking  
from   emp;  

输出:

ENAME   SAL   RANKING
KING    5000    1   
FORD    3000    2  
SCOTT   3000    2  
JONES   2975    3  
CLARK   2850    4  
BLAKE   2850    4  
ALLEN   1600    5  

包裹一个过滤器并挑选出第 N 高的薪水,比如第 4 高的薪水。

询问:

select *  
from  
(  
  select ename  
        ,sal  
        ,dense_rank() over (order by sal desc) ranking  
  from   emp  
)  
where ranking = 4 -- Replace 4 with any value of N  

输出:

ENAME  SAL  RANKING
BLAKE  2850     4  
CLARK  2850     4  
于 2016-08-05T06:51:25.123 回答