Нахождение исторических записей с использованием Oracle PL / SQL - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующая таблица 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, который позволит пользователю определить название отдела и хронологическую дату, в результате чего в запросе отобразятся все назначенные сотрудники. в этот отдел в указанный c момент времени.

Пример. Если бы я хотел узнать всех сотрудников, которые работали в отделе финансов в 2019-10-01 годах, запрос вернул бы:

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

(обратите внимание, дата "ухода" из Департамента была бы хорошей, но необязательной)

Есть идеи?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Для этого можно использовать оконные функции:

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() получает " следующий "record_date того же empid. Внешний запрос использует эту информацию в качестве параметра фильтра для поиска соответствующих записей.

0 голосов
/ 18 апреля 2020

В приведенном вами примере вам нужен список сотрудников с исторической датой для каждого отдела (если работал). Этого можно достичь с помощью простого подзапроса

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
...