【问题标题】:Locating Historical records using Oracle PL/SQL使用 Oracle PL/SQL 定位历史记录
【发布时间】:2020-08-01 04:06:21
【问题描述】:

我有以下 Oracle 员工表,用于跟踪各个部门之间的员工流动。

EMPID   DEPARTMENT  RECORD_DATE
123456  Technology  2019-01-01
123456  Technology  2019-02-25
123456  Finance     2019-03-01
123456  Finance     2019-09-28
123456  HR          2020-03-01

987654  HR          2019-04-01
987654  Finance     2019-09-01
987654  HR          2020-01-31

我需要编写一个 Oracle PL/SQL 脚本,允许用户定义部门名称和历史日期,从而使查询显示在特定时间点分配到该部门的所有员工。

示例:如果我想知道 2019 年 10 月 1 日在财务部门工作的所有员工,查询将返回:

EMPID   DEPARTMENT  DEPARTMENT_START_DATE  
123456  Finance     2019-03-01    
987654  Finance     2019-09-01 

(注意,部门“离开”日期会很好,但可选)

有什么想法吗?

【问题讨论】:

  • 为什么 PL/SQL - 一个普通的 SQL SELECT 语句还不够吗? (提示:很多不知情的人认为“PL/SQL”的意思是“Oracle SQL”。事实并非如此。)

标签: sql oracle date select plsql


【解决方案1】:

您可以为此使用窗口函数:

select empid, department, record_date
from (
    select 
        t.*, 
        lead(record_date) over(partition by empid order by record_date) lead_record_date
    from mytable t
) t
where 
    department = :department_id
    and :target_date >= record_date 
    and (:target_date < lead_record_date or lead_record_date is null)

:department_id:target_date 表示查询的参数。

在子查询中,lead() 检索同一 empid 的“下一个”record_date。外部查询使用该信息作为过滤参数来定位相关记录。

【讨论】:

    【解决方案2】:

    对于您给出的示例,您似乎需要每个部门的历史日期的员工列表(如果工作)。这可以通过简单的子查询来实现

    select empid,record_date from(
    select empid,department,record_Date,ROW_NUMBER() over (partition by empid,department order by empid) as id
    from employee)a
    where id=1
    order by 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 2015-07-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      相关资源
      最近更新 更多