2012-03-30 3 views
2

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

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

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

+0

Какого типа БД вы используете? –

+0

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

+1

Я не понимаю, как определяется результат. Почему в первой строке результата дата окончания 2012-04-01? – fancyPants

ответ

0

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

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

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 
+0

Спасибо, это здорово. Это именно то, что я ищу –