【问题标题】:How I can get Second max salary using "over(partition by)" in oracle SQL?如何在 oracle SQL 中使用“over(partition by)”获得第二个最高工资?
【发布时间】:2018-04-03 18:22:03
【问题描述】:

我已经通过这个查询得到了它:

   SELECT * 
    FROM
      (
      SELECT emp_id,salary,row_number() over(order by salary  desc) AS rk 
      FROM test_qaium
      ) 
    where rk=2;

但是我的一个朋友让我从雇员表中找到第二个MAX 工资,必须在 oracle sql 中使用“over(partition by )”。任何人请帮助我。 并清除我在 oracle sql 中“Partition by”的概念。

【问题讨论】:

  • 能否请教一下?
  • 您的查询似乎符合您的描述。你到底有什么问题?
  • Edit您的问题并添加一些sample data 和基于该数据的预期输出。 Formatted textno screen shotsedit 您的问题 - 请不要在 cmets 中提供邮政编码或其他信息。

标签: sql oracle greatest-n-per-group window-functions


【解决方案1】:

Oracle 设置

CREATE TABLE test_qaium ( emp_id, salary, department_id ) AS
  SELECT  1, 10000, 1 FROM DUAL UNION ALL
  SELECT  2, 20000, 1 FROM DUAL UNION ALL
  SELECT  3, 30000, 1 FROM DUAL UNION ALL
  SELECT  4, 40000, 1 FROM DUAL UNION ALL -- One highest, one 2nd highest
  SELECT  5, 10000, 2 FROM DUAL UNION ALL
  SELECT  6, 20000, 2 FROM DUAL UNION ALL
  SELECT  7, 30000, 2 FROM DUAL UNION ALL
  SELECT  8, 30000, 2 FROM DUAL UNION ALL -- Two highest, one 2nd highest
  SELECT  9, 10000, 3 FROM DUAL UNION ALL
  SELECT 10, 10000, 3 FROM DUAL UNION ALL -- Two highest, no 2nd highest
  SELECT 11, 10000, 4 FROM DUAL UNION ALL -- One highest, no 2nd highest
  SELECT 12, 20000, 5 FROM DUAL UNION ALL
  SELECT 13, 20000, 5 FROM DUAL UNION ALL
  SELECT 14, 30000, 5 FROM DUAL;          -- One highest, Two 2nd highest

查询

这将获得每个部门薪水第二高的所有行:

SELECT * 
FROM   (
  SELECT t.*,
         DENSE_RANK() OVER (PARTITION BY department_id
                            ORDER BY salary DESC) AS rnk 
  FROM   test_qaium t
) 
WHERE  rnk=2;

输出

EMP_ID SALARY DEPARTMENT_ID RNK
------ ------ ------------- ---
     3  30000             1   2
     6  20000             2   2
    12  20000             5   2
    13  20000             5   2

【讨论】:

  • 非常感谢。正是想要这个。但是很抱歉,由于我的声誉低下,我无法为您的答案投票。
【解决方案2】:

如果您有多名员工以相同的薪水,您的查询将不起作用...

试试:

SELECT emp_id,
       salary,
       dense_rank() over(order by salary desc) AS rk 
FROM test_qaium

partition by 子句的作用类似于 group by,这里没有任何需要分组的内容。

【讨论】:

  • 谢谢。但我提到我必须在查询中使用“over(partition by)”。实际上,这只是为了好奇是否有可能。
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2013-02-24
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
相关资源
最近更新 更多