Как создать столбец ValidTo в SQL (тип SCD 2)
У меня есть эта задача: Для этой задачи используйте следующие таблицы в предоставленном наборе данных: [Employee]
(содержит имя и дату начала работы для каждой должности всех сотрудников, бизнес-ключ однозначно идентифицирует каждого сотрудника) [Position]
(содержит имя уровня для каждой позиции) Создайте оператор SQL, который возвращает следующие столбцы
[EmployeeKey]
[EmployeeBK]
[Name]
[Level]
[ValidFrom]
[ValidTo]
Столбец [ValidTo] должен соответствовать следующим правилам: 1) Значение должно быть за день до даты начала следующей позиции (без наложения, без "дырок" в истории позиций) 2) Последняя позиция должна считаться открытой и иметь дата окончания по умолчанию
'2222-12-31' (YYYY-MM-DD)
Дополнительный вопрос: определите проблемы качества данных в наборе данных
[dbo].[Employee](
[EmployeeKey] [int] NOT NULL,
[EmployeeBK] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[ValidFrom] [date] NULL
)
[dbo].[Position](
[EmployeeKey] [int] NOT NULL,
[Level] [varchar](9) NULL
)
Некоторые записи:
1. EmployeeKey EmployeeBK Name Level ValidFrom
15 2 Kayla Level 1 2013-01-01
54 2 Kayla Level 2 2013-03-15
63 2 Kayla Level 3 2013-04-19
81 2 Kayla Level 4 2013-07-28
116 2 Kayla Level 5 2014-05-31
143 2 Kayla Level 6 2015-01-15
171 2 Kayla Level 7 2016-03-25
193 2 Kayla Level 8 2016-05-31
194 2 Kayla Level 9 2016-05-31
11 3 Hudson Level 1 2013-01-01
38 3 Hudson Level 2 2013-01-30
49 3 Hudson Level 3 2013-02-20
80 3 Hudson Level 4 2013-07-26
91 3 Hudson Level 5 2013-11-05
101 3 Hudson Level 6 2013-12-28
105 3 Hudson Level 7 2014-03-24
Заранее спасибо!
1 ответ
with ValidDate as
(select e.EmployeeKey, LEAD(e.ValidFrom, 1, '2222-12-31') over (partition by e.EmployeeBK order by p.[Level]) as ValidTo from
dbo.Employee e
left join dbo.Position p on p.EmployeeKey = e.EmployeeKey)
select distinct e.EmployeeKey
, e.EmployeeBK
, e.Name
, p.[Level]
, e.ValidFrom
, dateadd(day, -1, v.ValidTo) as ValidTo
--, v.ValidTo as ValidTest
from dbo.Employee e
join dbo.Position p on p.EmployeeKey = e.EmployeeKey
join ValidDate v on v.EmployeeKey = e.EmployeeKey
group by e.EmployeeKey, e.EmployeeBK, e.Name, p.[Level], e.ValidFrom, v.ValidTo
order by e.EmployeeBK