oracle 如何基于同一个表中的一个列为给定的组合只获取一条记录

4ngedf3f  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(125)

我是Oracle DB的新手。我有一个Oracle表(EMPLOYEE),如下所示。我想根据员工的最大有效日期获取记录:
| 员工姓名|生效日期| Eff Date |
| --|--| ------------ |
| 杜克|2022年1月1日| 01-JAN-2022 |
| 杜克|2023年2月1日|01-FEB-2023|
| 杜克|2022年12月1日| 01-DEC-2022 |
| 迈克|2022年1月1日| 01-JAN-2022 |
| 迈克|2022年12月1日**|01-DEC-2022|
| 杰克|2023年1月1日| 01-JAN-2023 |
| 杰克|2023年3月1日|01-MAR-2023|
我期望输出如下:
| 员工姓名|生效日期| Eff Date |
| --|--| ------------ |
| 杜克|2023年2月1日| 01-FEB-2023 |
| 迈克|2022年12月1日| 01-DEC-2022 |
| 杰克|2023年3月1日| 01-MAR-2023 |
有人可以指导如何编写一个SQL查询,以根据最大有效日期为每个EmpId获取一条记录吗

jmp7cifd

jmp7cifd1#

一种选择是使用一个分析函数(例如rank,在多行具有相同日期的情况下,它可能比row_number更好,而其他列值不同-在这种情况下可能不是这种情况),按员工按日期降序排序,然后提取排名最高的行。
样本数据:

SQL> with employee (id, name, eff_date) as
  2    (select 123, 'Duke', date '2022-01-01' from dual union all
  3     select 123, 'Duke', date '2023-02-01' from dual union all
  4     select 123, 'Duke', date '2022-12-01' from dual union all
  5     --
  6     select 456, 'Mike', date '2022-01-01' from dual union all
  7     select 456, 'Mike', date '2022-12-01' from dual
  8    ),

字符串
查询:

9  temp as
 10    (select id, name, eff_date,
 11       rank() over (partition by id order by eff_date desc) rnk
 12     from employee
 13    )
 14  select id, name, eff_date from temp
 15  where rnk = 1;

        ID NAME EFF_DATE
---------- ---- -----------
       123 Duke 01-FEB-2023
       456 Mike 01-DEC-2022

SQL>


我们在引入分析函数之前使用的选项在子查询中查找最大日期,但该选项现在比前一个更糟糕,因为它扫描同一个表(employees)两次。

<snip>
  9  select id, name, eff_date
 10  from employee a
 11  where a.eff_date = (select max(b.eff_date)
 12                      from employee b
 13                      where b.id = a.id
 14                     );

        ID NAME EFF_DATE
---------- ---- -----------
       123 Duke 01-FEB-2023
       456 Mike 01-DEC-2022

SQL>

相关问题