首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Partition的SQL中最高薪资和第五最高薪资的差异

使用Partition的SQL中最高薪资和第五最高薪资的差异
EN

Stack Overflow用户
提问于 2016-12-20 18:39:45
回答 4查看 183关注 0票数 1

我有这样的数据:

代码语言:javascript
复制
CREATE TABLE salaries AS
SELECT * FROM ( VALUES
  ('US'    , 'A', 3935),
  ('US'    , 'B', 7805),
  ('US'    , 'C', 2302),
  ('US'    , 'D', 6772),
  ('US'    , 'E', 3173),
  ('US'    , 'F', 7739),
  ('Japan' , 'G', 3881),
  ('Japan' , 'H', 1158),
  ('Japan' , 'I', 2591),
  ('Japan' , 'J', 3758),
  ('Japan' , 'K', 8710),
  ('Japan' , 'L', 3376),
  ('France', 'M', 5768),
  ('France', 'N', 9466),
  ('France', 'O', 1750),
  ('France', 'P', 1049),
  ('France', 'Q', 3479),
  ('France', 'R', 5305)
) AS t(country,employee,salary);

为了找出每个国家的最高工资和第五最高工资之间的差别,我正在尝试以下办法:

代码语言:javascript
复制
select max(salary) over (partition by country) - rank(5) over (partition by country) 
from salaries

但是它抛出了以下错误:

“组内为有序集聚合函数所必需”

有人可以建议不使用任何连接的任何方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-20 19:00:17

代码语言:javascript
复制
select      country
           ,max(salary) - max(case dr when 5 then salary end) as salary_diff

from       (select      country     
                       ,salary
                       ,dense_rank() over (partition by country order by salary desc) as dr

            from        salaries
            ) s

group by    country            
票数 2
EN

Stack Overflow用户

发布于 2016-12-20 18:57:03

  1. 创建一个定义所需内容的窗户 (按国家划分,按薪资降序)
  2. 通过该窗口计算max(salary)
  3. 从顶部计算nth_value (因为它们是按薪资递减排序的)

特别要注意的是,WINDOWS有范围和行。它们详细说明了如何在该窗口内执行计算。在这里,我们必须解除对WINDOW的绑定,以使nth_value()工作。通常情况下,它会计算所看到的一切,所以只有当它看到这一行时,nth_value才会起作用--但是我们可以让它在前面看到。

密码,

代码语言:javascript
复制
SELECT *
  , max(salary) OVER w1 - nth_value(salary,5) OVER w1 AS max_minus_fifth_highest
FROM foo
WINDOW w1 AS (
  PARTITION BY (country)
  ORDER BY SALARY desc
  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)
ORDER BY country;

Sql Demo

票数 2
EN

Stack Overflow用户

发布于 2016-12-20 18:51:16

代码语言:javascript
复制
select country, max_sal - salary
from (
     select country, salary, 
            max(salary) over (partition by country) max_sal,
           case when (row_number() over (partition by country
                                         order by salary desc)) = 5 
                then 1 
           end fifth
from table
) t where fifth is not null;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41249134

复制
相关文章

相似问题

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