2012-03-30 4 views
2

Ich habe Probleme mit einer sich langsam ändernden Dimensionstyp II Auswahl. Ich suche nach der tatsächlichen Länge einer Mitarbeiterqualifikation, damit ich Anfang und Ende seiner Zertifizierung in einem Bericht anzeigen kann. Wie würdest du das machen? Unten habe ich ein Bild der Aufzeichnungen für einen Angestellten '80844' und unterhalb der Aufzeichnungen das erwartete Ergebnis aufgenommen.Auswahl aus einem sich langsam ändernden Maßtyp II

Ich verwende Microsoft SQL Server 2008 R2.

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

+0

Welche Art von DB verwenden Sie? –

+0

Ich verwende Microsoft SQL Server 2008 R2. –

+1

Ich bekomme nicht, wie das Ergebnis bestimmt wird. Warum ist in der ersten Zeile des Ergebnisses das Enddatum 2012-04-01? – fancyPants

Antwort

0

Vielen Dank für interessante Frage. Es ist bekannt, "Lücken und Inseln" Problem. Sie können mehr darüber lesen there.

Für Ihren Fall Lösung könnte so aussehen:

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

Danke, das ist großartig. Genau das, wonach ich suche –

Verwandte Themen