admin

SQL查询找到第N个最高薪水

sql

我指的是以下查询,以找到雇员的Nth最高薪水。

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

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

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

谢谢你。


阅读 197

收藏
2021-05-10

共1个答案

admin

首先,查询将返回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
            )
2021-05-10