SQL запрос - попытка вернуть записи, содержащие результаты из предыдущих и текущих записей - PullRequest
1 голос
/ 06 мая 2020

, поэтому моя таблица (Таблица A) содержит записи, которые показывают, кому подчиняется сотрудник. Когда человек меняет «Отчеты на», он обновляет таблицу и отображает СТАРЫЕ и НОВЫЕ значения. Я изо всех сил пытаюсь написать запрос SQL, чтобы вернуть предыдущего работодателя вместе с новым работодателем.

Таблица A

-----------------------------------------------------------------------  
ID    |Date                           |Employee |Reports To  |Command
-----------------------------------------------------------------------   
1     |2020-05-05 09:32:56.193        |EMP0        |EMP1      OLD
-----------------------------------------------------------------------   
2     |2020-05-05 09:39:56.193        |EMP0        |EMP2      NEW
-----------------------------------------------------------------------   
3     |2020-05-05 11:32:56.193        |EMP0        |EMP2      OLD
-----------------------------------------------------------------------   
4     |2020-05-05 11:38:56.193        |EMP0        |EMP3      NEW
-----------------------------------------------------------------------   
5     |2020-05-05 19:32:56.193        |EMP0        |EMP3      OLD
 -----------------------------------------------------------------------   
6     |2020-05-05 19:35:56.193        |EMP0        |EMP2      NEW
------------------------------------------------------------------------   

Результаты, которые я хотел бы вернуть:

------------------------------------------------------------   
ID    |Employee |Currently Reports To |Previously Reported To
-------------------------------------------------------------  
1      EMP0         EMP2               EMP1  
-------------------------------------------------------------  
2      EMP0         EMP3               EMP2      
-------------------------------------------------------------
3      EMP0         EMP2               EMP3      
------------------------------------------------------------- 

SQL Запрос, который я пробовал:

SELECT Employee, tb1.[Reports To] FROM Table A tb1 JOIN Table A tb2
ON tb1.Employee =tb2.Employee AND tb1.Reports To <> tb2.Reports To
AND tb2.Command = 'OLD'
WHERE tb1.Command = 'NEW'```

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вы также можете использовать apply:

select row_number() over (order by t.date) as id,
       t.employee, t.reportsto as CurrentlyReportsTo, t1.reportsto as PreviouslyReportsTo
from table t cross apply
     ( select top (1) t1.reportsto
       from tab;e t1
       where t1.employee = t.employee and t1.command = 'OLD' and t1.date <= t.date
       order by t1.date desc
     ) t1
where t.command = 'NEW';
0 голосов
/ 06 мая 2020

Ваши строки имеют одинаковые отметки времени. Это также позволяет использовать агрегирование:

select employee,
       max(case when command = 'NEW' then reports_to end) as current_reports_to,
       max(case when command = 'OLD' then reports_to end) as previously_reports_to
from t
group by employee, timestamp;
0 голосов
/ 06 мая 2020

Если "старые" и "новые" записи правильно чередуются, вы можете просто использовать lead() или lag():

select
    employee,
    reports_to     as currently_reports_to,
    lag_reports_to as previously_reported_to
from (
    select t.*, lag(reports_to) over(partition by employee order by date, id) lag_reports_to
    from mytable t
) t
where command = 'NEW'
...