sql - 从缓慢变化的尺寸类型 II 中进行选择

标签 sql type-2-dimension

我在选择缓慢变化的维度类型 II 时遇到了问题。我希望选择员工技能认证的实际长度,以便我可以在报告中显示其认证的开始和结束时间。你会怎样做呢?下面我包含了员工“80844”的记录图像,记录下方是预期结果。

我使用的是 Microsoft SQL Server 2008 R2。

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

最佳答案

谢谢你提出有趣的问题。这是众所周知的“差距和岛屿”问题。您可以阅读更多相关信息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

关于sql - 从缓慢变化的尺寸类型 II 中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9938966/

相关文章:

sql - View 或函数的更新或插入失败,因为它包含派生字段或常量字段

c - 我想用字符串填充二维指针数组

java - 从数据库填充JTable

java - 将一维字符串数组转换为二维字符数组?

sql - SQL Server 中每行超过 8060 字节会对性能产生什么影响?

mysql - 奇怪的 : MySQL Left Join, "unknown column";同样的 leftjoin 在多表查询中不起作用

mysql - 连接两个表,一个具有相同的唯一行,另一个具有多个对应行

Java将一维 vector 添加到二维 vector

SQL Server 2008-获取表约束