Определите столбец, измененный в SCD типа 2 на сервере SSIS SQL - PullRequest
0 голосов
/ 04 августа 2020

Я отслеживаю данные в своей таблице SCD, как показано на изображении ниже, с помощью пакета SSIS.

введите описание изображения здесь

Мне нужно добавить новый столбец «Обновленный столбец» (как показано выше), который представляет, какие столбцы были обновлены между транзакциями N и N-1. Это может быть выполнено с помощью курсора, однако я ищу предложения, чтобы сделать это эффективным способом. Возможно ли выполнение в SCD или любой другой встроенной SQL серверной функции?

скрипт добавления:

    Create table SCDtest 
(
 id int ,
 empid int ,
 Deptid varchar(10),
 Ename varchar(50),
 DeptName varchar(50),
 city varchar(50),
 startdate datetime,
 Enddate datetime , 
 ColumnUpdated varchar(500)
)

Insert into SCDtest values (1, 1, 'D1', 'Mike', 'Account', 'Atlanta', '7/31/2020', '8/3/2020','' )
Insert into SCDtest values (2, 2, 'D2', 'Roy', 'IT', 'New York', '7/31/2020', '8/5/2020','' )
Insert into SCDtest values (3, 1, 'D1', 'Ross', 'Account', 'Atlanta', '8/4/2020', '8/7/2020','' )
Insert into SCDtest values (4, 2, 'D2', 'Roy', 'IT', 'Los angeles', '8/5/2020',NULL ,'' )
Insert into SCDtest values (5, 1, 'D1', 'John', 'Marketing', 'Boston', '8/8/2020', NULL,'')

Спасибо

1 Ответ

0 голосов
/ 11 августа 2020

Честно говоря, я действительно не знаю, зачем вам эта функция, поскольку вы можете очень легко просто взглянуть на две строки, чтобы увидеть любые изменения, на случай, если вам действительно нужно их увидеть. Мне никогда не требовалось значение типа ColumnUpdated, и я не думаю, что обработка, необходимая для его создания, и хранилище для хранения данных того стоит.

Тем не менее, вот один из способов вычислить желаемый результат на основе заданных вами тестовых данных. В идеале вы бы сделали это более эффективным способом в рамках вашего процесса ETL, который обновляет строки по мере их поступления, а не все сразу. Хотя это, очевидно, требовало информации о вашем ETL, которую вы не включили в свой вопрос:

Запрос

declare @SCDtest table(id int,empid int,Deptid varchar(10),Ename varchar(50),DeptName varchar(50),city varchar(50),startdate datetime,Enddate datetime);
Insert into @SCDtest values(1, 1, 'D1', 'Mike', 'Account', 'Atlanta', '7/31/2020', '8/3/2020'),(2, 2, 'D2', 'Roy', 'IT', 'New York', '7/31/2020', '8/5/2020'),(3, 1, 'D1', 'Ross', 'Account', 'Atlanta', '8/4/2020', '8/7/2020'),(4, 2, 'D2', 'Roy', 'IT', 'Los angeles', '8/5/2020',NULL),(5, 1, 'D1', 'John', 'Marketing', 'Boston', '8/8/2020', NULL);

with l as
(
    select *
          ,lag(id,1) over (partition by empid order by id) as l
    from @SCDtest
)
select l.id
      ,l.empid
      ,l.Deptid
      ,l.Ename
      ,l.DeptName
      ,l.city
      ,l.startdate
      ,l.Enddate
      ,stuff(concat(case when l.Deptid <> t.Deptid then ', Deptid' end
                   ,case when l.Ename <> t.Ename then ', Ename' end
                   ,case when l.DeptName <> t.DeptName then ', DeptName' end
                   ,case when l.city <> t.city then ', city' end
                   )
            ,1,2,''
            ) as ColumnUpdated
from l
    left join @SCDtest as t
        on l.l = t.id
order by l.empid
        ,l.startdate;

Вывод

+----+-------+--------+-------+-----------+-------------+-------------------------+-------------------------+-----------------------+
| id | empid | Deptid | Ename | DeptName  |    city     |        startdate        |         Enddate         |     ColumnUpdated     |
+----+-------+--------+-------+-----------+-------------+-------------------------+-------------------------+-----------------------+
|  1 |     1 | D1     | Mike  | Account   | Atlanta     | 2020-07-31 00:00:00.000 | 2020-08-03 00:00:00.000 | NULL                  |
|  3 |     1 | D1     | Ross  | Account   | Atlanta     | 2020-08-04 00:00:00.000 | 2020-08-07 00:00:00.000 | Ename                 |
|  5 |     1 | D1     | John  | Marketing | Boston      | 2020-08-08 00:00:00.000 | NULL                    | Ename, DeptName, city |
|  2 |     2 | D2     | Roy   | IT        | New York    | 2020-07-31 00:00:00.000 | 2020-08-05 00:00:00.000 | NULL                  |
|  4 |     2 | D2     | Roy   | IT        | Los angeles | 2020-08-05 00:00:00.000 | NULL                    | city                  |
+----+-------+--------+-------+-----------+-------------+-------------------------+-------------------------+-----------------------+
...