Oracle SQL - Изменения атрибута сканирования - PullRequest
1 голос
/ 01 мая 2020

У меня есть следующая таблица сотрудников

 EMPID   RECORD_DATE   DEPARTMENT
 123456  2020-01-01    HR
 123456  2020-02-01    HR
 123456  2020-03-01    FINANCE
 123456  2020-04-01    FINANCE

 987654  2020-01-01    HR
 987654  2020-02-01    HR
 987654  2020-03-01    HR
 987654  2020-04-01    LEGAL

Используя Oracle PL / SQL, мне нужно построить выражение для определения списка перемещений сотрудников, в частности, которые перешли от HR к любому другой (не HR) отдел.

Ожидаемый результат:

 EMPID   MOVEMENT_DATE DEPT_BEFORE DEPT_AFTER
 123456  2020-03-01    HR          FINANCE
 987654  2020-04-01    HR          LEGAL

Я знаю, что вы можете использовать функцию Lead или Lag, но это немного для меня:

 SELECT 
 ,EMP
 ,RECORD_DATE
 ,LAG(DEPARTMENT, 1, 0) OVER (PARTITION BY EMP ORDER BY RECORD_DATE)  PREV

 FROM EMP

Вот некоторые значения для работы:

 CREATE TABLE #EMP 
 (
     EMP VARCHAR(30) NOT NULL  ,
     RECORD_DATE DATE NOT NULL ,
     DEPARTMENT VARCHAR(30) NOT NULL
 );

 INSERT INTO #EMP (EMP, DATE_WORKED, CITY) 
 VALUES 
 ('123456','2020-01-01','HR'),
 ('123456','2020-02-01','HR'),
 ('123456','2020-03-01','FINANCE'),
 ('123456','2020-04-01','FINANCE'),

 ('987654','2020-01-01','HR'),
 ('987654','2020-02-01','HR'),
 ('987654','2020-03-01','HR'),
 ('987654','2020-04-01','LEGAL') 

1 Ответ

1 голос
/ 01 мая 2020

Вы можете сделать это, используя функцию LAG:

WITH data AS(
  SELECT 123456 EMPID, DATE '2020-01-01' RECORD_DATE, 'HR' DEPARTMENT FROM dual UNION ALL
   SELECT 123456 EMPID, DATE '2020-02-01' RECORD_DATE, 'HR' DEPARTMENT FROM dual UNION ALL
   SELECT 123456 EMPID, DATE '2020-03-01' RECORD_DATE, 'FINANCE' DEPARTMENT FROM dual UNION ALL
   SELECT 123456 EMPID, DATE '2020-04-01' RECORD_DATE, 'FINANCE' DEPARTMENT FROM dual UNION ALL
   SELECT 987654 EMPID, DATE '2020-01-01' RECORD_DATE, 'HR' DEPARTMENT FROM dual UNION ALL
   SELECT 987654 EMPID, DATE '2020-02-01' RECORD_DATE, 'HR' DEPARTMENT FROM dual UNION ALL
   SELECT 987654 EMPID, DATE '2020-03-01' RECORD_DATE, 'HR' DEPARTMENT FROM dual UNION ALL
   SELECT 987654 EMPID, DATE '2020-04-01' RECORD_DATE, 'LEGAL' DEPARTMENT FROM dual
 )
SELECT * FROM(
    SELECT 
      EMPID,
      RECORD_DATE MOVEMENT_DATE,
      LAG(DEPARTMENT) OVER (PARTITION BY EMPID ORDER BY RECORD_DATE)  DEPARTMENT_BEFORE,
      DEPARTMENT DEPARTMENT_AFTER
     FROM data
 )
 WHERE DEPARTMENT_BEFORE <> DEPARTMENT_AFTER;

     EMPID MOVEMENT_DATE   DEPARTMENT_BEFORE DEPARTMENT_AFTER 
---------- --------------- ----------------- -----------------
    123456 2020-03-01      HR                FINANCE          
    987654 2020-04-01      HR                LEGAL 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...