【问题标题】:find highest earners in last 10 years找出过去 10 年收入最高的人
【发布时间】:2021-11-10 06:53:16
【问题描述】:
create table empSal
(
  pername varchar(200),
  salary number(10,2),
  salDate date
);

begin
insert into empsal values('ak',6300.0,'31-JAN-2012');
insert into empsal values('js',6400.0,'31-JAN-2012');
insert into empsal values('pk',6500.0,'31-JAN-2012');
insert into empsal values('ak',6000.0,'28-FEB-2012');
insert into empsal values('js',5800.0,'28-FEB-2012');
insert into empsal values('pk',2300.0,'28-FEB-2012');
end;

给定 empsal 表(给定定义),每个人都在多年的月底获得薪水。 需要编写 plsql 查询来查找过去 10 年数据中的 3 个最高收入者吗?

【问题讨论】:

标签: sql oracle oracle11g oracle12c


【解决方案1】:

遗憾的是,您实际上没有运行您发布的代码(因为它会失败;表不能有那个主键,这没有意义)。

无论如何:总结过去 10 年的工资并按降序排列。然后选择所需的。

WITH
   temp
   AS
      (  SELECT pername,
                SUM (salary) sumsal,
                RANK () OVER (ORDER BY SUM (salary) DESC) rnk
           FROM empsal
          WHERE EXTRACT (YEAR FROM saldate) >= EXTRACT (YEAR FROM SYSDATE) - 10
       GROUP BY pername)
SELECT pername, sumsal
  FROM temp
 WHERE rnk <= 3;

【讨论】:

  • 抱歉,创建表时出错。我只是在考虑虚拟数据
  • EXTRACT (YEAR FROM saldate) 应该是 saldate &gt;= trunc(sysdate, 'yyyy') - interval '10' year 以利用分区/索引
【解决方案2】:

我们可以在这里使用RANK解析函数:

WITH cte AS (
    SELECT pername, SUM(salary) AS total_salary,
           RANK() OVER (ORDER BY SUM(salary) DESC) sal_rank
    FROM empSal
    WHERE salDate >= TRUNC(sysdate, 'YEAR') - INTERVAL '10 years'
    GROUP BY pername
)

SELECT pername, total_salary
FROM cte
WHERE sal_rank <= 3
ORDER BY sal_rank DESC;

【讨论】:

    【解决方案3】:

    EMPSAL 表中的主键不允许您按照您的意图多次插入同一员工。请删除它或创建另一列作为您的主键。

    下面是一个基本的选择语句,它将选择从当前日期开始的过去 10 年中收入最高的前三名。

    with salary_tenyears as (
        select pername , sum(salary ) salary 
        from empsal 
        where salDate >= trunc(add_months(sysdate,-12*10),'MM')
        group by pername
    )
    select *
    from ( select pername,salary  , row_number() over( order by salary desc) rnk
            from salary_tenyears
    ) a
    where rnk <=3;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多