【问题标题】:Finding second highest salary in all the companies在所有公司中找到第二高的薪水
【发布时间】:2014-12-10 17:57:13
【问题描述】:

我必须在我表中的所有公司中找到第二高的薪水

Name   Company Salary

alex    abc    50000
bert    abc    23000
charly  abc    45555
doris   xyz    34444
ellen   xyz    67777
fred    xyz    67771

我只提到了 tcs 和 hcl 等 2 家公司,但在我的场景中可能有 200 多家公司,所以我不能使用 WHERE 子句或 UNION 所以请帮助我

【问题讨论】:

  • 那么GROUP BY呢?
  • 我真的希望这些是示例数据,而不是真实数据。如果它们是真实数据,我想我发现您的样本中至少有两个人是谁。我认为那些人不会希望他的薪水现在知道。
  • select max(salary) from company group by company 这可用于查找最大值,但用于第二高的薪水
  • 好的,我确定了您数据中除了 2 个人之外的所有人员。真的,不酷。
  • @DarkDust 看到这只是一个名字,为什么你要搞政治我不知道

标签: sql oracle10g oracle-sqldeveloper


【解决方案1】:

使用dense_rank 之类的分析函数生成编号。在这种情况下,dense_rankrow_numberrank 更合适,因为后者可能在编号上有间隙,在这种情况下您根本不会得到任何结果。当有两个人的最高薪水相同时,就会发生这种情况。如果你使用rank,那么这些人的排名都将是1,而下一个人的排名将是3

我不明白您是想要整体排名第二还是每个公司排名第二,但我已经展示了两者。如果您需要另一个排名,您可以按其他排名进行过滤。

SELECT * FROM
  (SELECT
    Name, 
    Company,
    Salary,
    dense_rank() over (order by Salary DESC) as OverallSalaryRank,
    dense_rank() over (partition by Company order by Salary DESC) as SalaryRankPerCompany
  FROM
    SALARIES s)
WHERE
  SalaryRankPerCompany = 2

【讨论】:

    【解决方案2】:

    此语句会将您的工资数据从最高到最低排序,并将添加每个公司的排名位置。

    WHERE 条件将在第二个位置过滤它们。正如建议的那样,如果两个雇主的薪水相同,我也会使用DENSE_RANK 来获得“第二名”。

    SELECT Company, Salary 
      FROM ( SELECT Company, Salary, DENSE_RANK() OVER (ORDER BY Salary DESC) sal_rank
               FROM mytable ) 
    WHERE sal_rank = 2;
    

    【讨论】:

    • 使用rank,您可能根本得不到任何结果。
    猜你喜欢
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2019-04-17
    • 2011-01-30
    • 2020-01-29
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多