【问题标题】:Rank NULL Value as well while using Rank in Oracle SQL在 Oracle SQL 中使用 Rank 时也对 NULL 值进行排名
【发布时间】:2019-05-03 17:52:20
【问题描述】:

我是新手,正在学习 SQL。在练习平台上练习 SQL 时,我遇到了以下问题: 编写 SQL 查询,从 Employee 表中获取第二高的薪水。

|Id  | Salary 
| 1  | 100   
| 2  | 200 
| 3  | 300 

例如,给定上面的 Employee 表,查询应该返回 200 作为第二高的薪水。如果没有第二高的薪水,则查询应返回 null。

|第二高薪| | 200 |

我打算使用 Oracle Analytical 函数来编写查询。我写的查询如下:

select Salary as SecondHighestSalary 
from (SELECT salary, dense_rank() over(order by salary desc)  myrank 
FROM Employee)
where myrank =2;

我的查询无法处理 NULL 值测试用例并引发错误。谁能回答我的问题?

【问题讨论】:

  • 你得到了什么错误信息?
  • “没有第二高的薪水”的定义是什么?我知道如果只有一个薪水(在整个数据中),就没有第二高的;还有其他情况吗?
  • @ZekiGumus :如果测试用例的值为 null ,我的查询无法将值显示为 null 。错误显示如下: 输入 {"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100]]}} 输出 {"headers ":["SECONDHIGHESTSALARY"],"values":[]} 预期 {"headers":["SecondHighestSalary"],"values":[[null]]}
  • 我刚刚获取了您的数据和您的查询以及created a dbfiddle with it。当所有三行都可用时,查询正确返回 200。当只有一行可用时,查询不返回任何内容,因为它应该。当没有行可用时,查询再一次不返回任何内容。请使用标签下方的edit 按钮编辑您的问题,并告诉我们您收到的错误消息。谢谢。
  • @BobJarvis 这是 LeetCode 练习题中的一个问题。所以我只是将问题从那里粘贴到这里。

标签: sql oracle


【解决方案1】:

当没有第二高值时,您的查询返回没有行。如果你想要NULL 的单行,你需要做到这一点。一个简单的方法是聚合函数:

select max(Salary) as SecondHighestSalary 
from (SELECT salary, dense_rank() over(order by salary desc) as myrank 
      from Employee
     ) e
where myrank = 2;

【讨论】:

  • 嗨,戈登,感谢您的回复。这效果最好。非常感谢。我已经编写了另一个查询,该查询具有类似的概念,即显示具有 NULL 值的 ro,如下所示: select max(Salary) as SecondHighestSalary FROM ( select Salary, nvl(DENSE_RANK() OVER(order by Salary desc), null) as nth FROM Employee )其中第 n = 2;
  • DENSE_RANK() 永远无法返回NULL,所以我不确定nvl() 应该做什么(我推荐COALESCE(),因为它是ANSI/ISO 标准函数) .
  • 嗨,戈登,感谢您的反馈。
【解决方案2】:

下面的查询也可以。 min(Salary)max(Salary) 都可以。

SELECT min(Salary) as "SecondHighestSalary" FROM (
    SELECT Salary, dense_rank() over(ORDER BY Salary DESC) as dense_rank
    from Employee
    ) WHERE dense_rank=2; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 2012-04-19
    • 2016-08-16
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多