首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择*从c中选择薪资(按工资顺序从c顺序选择薪资,按行薪资组按行薪资,具有rownum=2);

选择*从c中选择薪资(按工资顺序从c顺序选择薪资,按行薪资组按行薪资,具有rownum=2);
EN

Stack Overflow用户
提问于 2017-10-06 06:19:29
回答 2查看 46关注 0票数 0

我想要第二高的薪水。

代码语言:javascript
复制
SELECT *
FROM c
WHERE salary IN (
        SELECT salary
        FROM c
        ORDER BY salary DESC
        GROUP BY rownum salary
        HAVING rownum = 2
        );

错误:缺少表达式

EN

回答 2

Stack Overflow用户

发布于 2017-10-06 06:21:55

您可以在这里使用秩分析函数。

代码语言:javascript
复制
SELECT salary
FROM
(
    SELECT salary, DENSE_RANK() OVER (ORDER BY salary DESC) dr
    FROM c
) t
WHERE dr = 2;

这将返回第二高的薪金按密集的等级,包括所有联系第二。

票数 2
EN

Stack Overflow用户

发布于 2017-10-06 09:02:54

解释为什么您的子查询不能工作:

  1. 首先,记录按任意顺序从表中读取。这是他们获得rownum的时候。
  2. 然后进行聚合;一个salary的所有记录都压缩到一个行。您以前拥有的单个行的rownum不再可用。
  3. 然后聚合的行由HAVING过滤,这是无法工作的,因为您正在尝试访问rownum。而且,rownum = 2上的条件总是失败的,因为您正在删除第一行,所以它是“未读”,rownum 1仍然可用,您忽略了第二行,因为您甚至还没有读过rownum 1,等等。rownum的条件总是rownum <= some_number (除了1种条件外,您可以拥有rownum = 1)。
  4. 最后发生的事情是排序;因此,ORDER BY子句属于查询的末尾。(之后只有甲骨文12c的FETCH FIRST n ROWS。)

下面是如何使它与rownum一起工作的方法

代码语言:javascript
复制
select salary
from
(
  select salary
  from
  (
    select distinct salary 
    from c
    order by salary desc
  )
  where rownum <= 2
  order by salary
)
where rownum = 1;

这是可行的,因为Oracle在这里违反了SQL标准。根据标准,来自子查询的数据被认为是无序的,但是Oracle在使用rownum时保证顺序。

下面是如何使用聚合来完成这一任务:

代码语言:javascript
复制
select max(salary) from c where salary < (select max(salary) from c);

由于Oracle 10,您也可以使用解析函数,如Tim的答案所示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46599443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档