Выбор из медленно меняющегося типа измерения II - PullRequest
2 голосов
/ 30 марта 2012

У меня проблемы с медленно меняющимся выбором размера II.Я хочу выбрать фактическую продолжительность сертификации навыков сотрудников, чтобы я мог отобразить начало и конец его сертификации в отчете.Как бы вы поступили так?Ниже я включил изображение записей для сотрудника '80844' и ниже записей ожидаемый результат.

Я использую Microsoft SQL Server 2008 R2.

Records an employee 80844 and the expected result needed to display his certification

1 Ответ

2 голосов
/ 01 апреля 2012

Спасибо за интересный вопрос.Это хорошо известная проблема «пробелов и островов».Вы можете прочитать больше об этом там .

Для вашего случая решение может выглядеть так:

    create table #tmp 
       (
         dimEmployeeID int not null,
         EmployeeNumber int not null,
         Start datetime not null,
         [End] datetime not null,
         SkillID int not null
       )


   insert into #tmp values
     (386 , 80844, '1900-01-01', '2012-02-28', 14),
     (1172, 80844, '2012-02-29', '2012-02-29', 14),
     (1173, 80844, '2012-03-01', '2012-04-01', 14),
     (1175, 80844, '2012-04-06', '2012-04-12', 14),
     (1176, 80844, '2012-04-13', '2012-04-21', 14),
     (1172, 80844, '2012-02-29', '2012-02-29', 87),
     (1173, 80844, '2012-03-01', '2012-04-01', 87),
     (1174, 80844, '2012-04-02', '2012-04-05', 87),
     (1175, 80844, '2012-04-06', '2012-04-12', 87)

   ;with StartingPoints as
   (
     SELECT EmployeeNumber, SkillID, Start, ROW_NUMBER() OVER(partition by EmployeeNumber,    SkillID order by Start asc) AS rn
     FROM #tmp AS A
     WHERE NOT EXISTS
       (
         SELECT 1
         FROM #tmp AS B
         WHERE 
           A.EmployeeNumber = B.EmployeeNumber
           and A.SkillID = B.SkillID
           and A.Start - 1 = B.[End]
        )
   ),
   EndingPoints AS
   (
     SELECT EmployeeNumber, SkillID, [End], ROW_NUMBER() OVER(partition by EmployeeNumber,    SkillID order by Start asc) AS rn
     FROM #tmp AS A
     WHERE NOT EXISTS
       (
         SELECT 1
         FROM #tmp AS B
         WHERE 
           A.EmployeeNumber = B.EmployeeNumber
           and A.SkillID = B.SkillID
           and A.[End] + 1 = B.Start
        )
   )
   SELECT S.EmployeeNumber, S.SkillID, S.Start, E.[End]
   FROM StartingPoints AS S
     JOIN EndingPoints AS E
   ON 
     S.EmployeeNumber = E.EmployeeNumber
     and S.SkillID = E.SkillID
     and S.rn = E.rn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...