加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-01-24 22:25:33 所属栏目:MsSql教程 来源:网络整理
导读:我指的是以下查询来查找员工的第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个最高薪水.

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; n产生这个结果?

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

谢谢.

解决方法

首先,查询将返回第n个最低工资值.要返回第n个最高工资值,您必须将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
            )

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读