我指的是以下查询来查找员工的第 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 产生这个结果吗?
我试图了解数据库如何在内部处理此查询并产生结果?
谢谢你。
首先,查询将返回nth
最低工资值。要返回nth
最高工资值,您必须更改t.sal <= sal
为t.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
)
要获得第 n 个最高工资值,只需输入“N”的值。
Select Min(Salary) From (Select Top N * From Table_Name Order by Salary Desc);
select sal
from (
select sal,
dense_rank() over (order by sal desc) as rnk
) t
where rnk = 5;
where rnk = 5
用你想要的任何“nth”替换。
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
查询返回第四高的薪水。
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
在数据库中记录数据条目,如
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;
希望对你有帮助
更改第 n 个最高工资值,只需输入 'N' 的值
SELECT e1.EmployeeName, e1.EmployeeSalary from Employee e1
where N = (
select COUNT(e2.EmployeeSalary) from Employee e2 where e2.EmployeeSalary >= e1.EmployeeSalary)
有很多方法可以实现这一点:-
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)
select salary
from (Select ROW_NUMBER() over(order by salary desc) as row ,salary from Employee)as temp
where row=2;
---2nd highest salary
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
询问:
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