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

标签 sql database

我指的是以下查询以查找员工的第 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 <= salt.sal >= sal .

接下来,此查询的工作方式是首先找到不同的薪水值列表作为一个派生表,然后确定薪水低于此列表中每个员工的员工数量。 t.sal <= sal正在获取派生表(大多数数据库需要有别名)并将每个值与外部 emp 进行比较 table 。需要注意的是,如果出现平局,这将返回多行。

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

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
            )

关于SQL 查询查找第 N 个最高薪水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492357/

相关文章:

database - 为什么不应该将邮政编码值放在 Boyce Codd 范式中?

mysql - 删除无效记录相关的自身问题

mysql - 如何将关键字与SQL查询匹配?

php - 无法添加或更新子行: a foreign key constraint fails

mysql - 从具有相同字段的所有表中选择

mysql - LEFT JOIN 返回与 INNER JOIN 相同的结果

MySQL高效数据转联表查询

php - 来自子域的空 MySQL 查询结果

mysql - 在一个查询中对多个数据库运行相同的查询 (MySQL)

mysql - 对于一个巨大的非分布式数据库,将大表分区成多个表不是仍然有意义吗?