2012-03-30 7 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

ありがとう、これは素晴らしいです。これは私が探しているものです –

関連する問題