Ssas 数据仓库和类型2 SCD和/或每日快照事实表

Ssas 数据仓库和类型2 SCD和/或每日快照事实表,ssas,data-warehouse,business-intelligence,datamart,Ssas,Data Warehouse,Business Intelligence,Datamart,我很难决定哪一个更适合我的场景。此场景中涉及的维度包括 员工维度 ╔═════════════╦════════════╦════════╦════════╦═══════════╦══════════╦════════╗ ║ EmployeeKey ║ EmployeeID ║ DeptID ║ Salary ║ StartDate ║ EndDate ║ Active ║ ╠═════════════╬════════════╬════════╬════════╬═══════════╬═

我很难决定哪一个更适合我的场景。此场景中涉及的维度包括

  • 员工维度

    ╔═════════════╦════════════╦════════╦════════╦═══════════╦══════════╦════════╗
    ║ EmployeeKey ║ EmployeeID ║ DeptID ║ Salary ║ StartDate ║ EndDate  ║ Active ║
    ╠═════════════╬════════════╬════════╬════════╬═══════════╬══════════╬════════╣
    ║ 1           ║ 1          ║ 1      ║ 9000   ║ 20150901  ║ 20150930 ║ FALSE  ║
    ║ 2           ║ 2          ║ 3      ║ 5000   ║ 20150901  ║ NULL     ║ TRUE   ║
    ║ 3           ║ 1          ║ 1      ║ 9500   ║ 20150930  ║ NULL     ║ TRUE   ║
    ╚═════════════╩════════════╩════════╩════════╩═══════════╩══════════╩════════╝
    
    ╔═══════════════╦══════════════╦══════╦══════╦═══════════╦═════════╦════════╗
    ║ DepartmentKey ║ DepartmentID ║ Name ║ Sepc ║ StartDate ║ EndDate ║ Active ║
    ╠═══════════════╬══════════════╬══════╬══════╬═══════════╬═════════╬════════╣
    ║ 1             ║ 1            ║ XXXX ║ AWK  ║ 20150901  ║ NULL    ║ TRUE   ║
    ║ 2             ║ 2            ║ YYYY ║ AUTO ║ 20150901  ║ NULL    ║ TRUE   ║
    ║ 3             ║ 3            ║ ZZZZ ║ AMD  ║ 20150901  ║ NULL    ║ TRUE   ║
    ╚═══════════════╩══════════════╩══════╩══════╩═══════════╩═════════╩════════╝
    
  • 部门维度

    ╔═════════════╦════════════╦════════╦════════╦═══════════╦══════════╦════════╗
    ║ EmployeeKey ║ EmployeeID ║ DeptID ║ Salary ║ StartDate ║ EndDate  ║ Active ║
    ╠═════════════╬════════════╬════════╬════════╬═══════════╬══════════╬════════╣
    ║ 1           ║ 1          ║ 1      ║ 9000   ║ 20150901  ║ 20150930 ║ FALSE  ║
    ║ 2           ║ 2          ║ 3      ║ 5000   ║ 20150901  ║ NULL     ║ TRUE   ║
    ║ 3           ║ 1          ║ 1      ║ 9500   ║ 20150930  ║ NULL     ║ TRUE   ║
    ╚═════════════╩════════════╩════════╩════════╩═══════════╩══════════╩════════╝
    
    ╔═══════════════╦══════════════╦══════╦══════╦═══════════╦═════════╦════════╗
    ║ DepartmentKey ║ DepartmentID ║ Name ║ Sepc ║ StartDate ║ EndDate ║ Active ║
    ╠═══════════════╬══════════════╬══════╬══════╬═══════════╬═════════╬════════╣
    ║ 1             ║ 1            ║ XXXX ║ AWK  ║ 20150901  ║ NULL    ║ TRUE   ║
    ║ 2             ║ 2            ║ YYYY ║ AUTO ║ 20150901  ║ NULL    ║ TRUE   ║
    ║ 3             ║ 3            ║ ZZZZ ║ AMD  ║ 20150901  ║ NULL    ║ TRUE   ║
    ╚═══════════════╩══════════════╩══════╩══════╩═══════════╩═════════╩════════╝
    
  • 员工情况表(每天)

  • 部门事实表(每天)
  • 我的问题

  • 知道Department维度包含活动的700万条记录,Departments维度包含活动的500000条记录,实现每日快照事实表的正确且最充分的方法是什么

  • 每天填写事实员工和事实部门并每天重复记录是否足够


  • 我正在使用SQL Server 2014数据库,预计将使用OLAP

    为什么要每天快照您的事实?事实应该拥有所有的数据。事实上,日期键应该足以处理基于日期的查询


    此外,我不建议将员工和维度视为事实——他们只考虑直接的维度。事实应该是衡量一些我在这里没有看到的东西。围绕在某个部门工作的员工所完成的某些流程/事务构建您的事实。将此事实链接到两个维度和日期维度。如果要保留事务中更改的历史记录,请启用维度SCD。

    可能的布局是为每个维度设置一个SCD2表

    这是一个部门的例子

    注意,我添加了一个数字版本属性来唯一地定义版本的顺序。 VALIDFROM_DATE列对应于用于构建维度的快照的有效性。 通常也会添加VALIDTO Date以优化访问-对于开放(最后)版本,会使用一些虚拟高值

    还请注意,设计区域介于有效起始日期和开始日期之间。 前者是您(从快照)获取信息的时间戳,后者是逻辑有效性。 在您于2013年8月20日获得的示例中,将于2013年9月1日创建一个新部门。 第二个版本代表一个部门的更名,第三个版本显示该部门于2015年9月1日关闭

    这种维度通常通过ETL作业来维护,该作业定期处理快照,识别更改并构建维度

    从事实数据表(即带有引用部门的交易记录的表)中,维度由DEPARTMENTKEY和Validation date(可选)引用(以匹配正确的版本)

    您还可以设置维度的当前视图(使用PK DEPARTMENTKEY)。这很简单,可以使用视图或带有查询的物化视图来完成 例如:

     with dept as (
     select 
       DEPARTMENTKEY,  
       min(VALIDFROM_DATE) over (partition by DEPARTMENTKEY) created_date,
       VALIDFROM_DATE last_change_date, DEPARTMENTID, NAME,
       FIRST_VALUE(NAME) over (partition by DEPARTMENTKEY order by VERSION) as INITIAL_NAME,
       SEPC, START_DATE, END_DATE, IS_ACTIVE,
       row_number() over (partition by DEPARTMENTKEY order by VERSION desc) as rn
     from Department_history)
     select 
       DEPARTMENTKEY, CREATED_DATE, LAST_CHANGE_DATE, DEPARTMENTID, NAME, INITIAL_NAME, SEPC, START_DATE, END_DATE, IS_ACTIVE
     from dept
     where rn = 1
     order by DepartmentKey
    
    您可能会从历史记录表的所有日期中获益-请参阅属性CREATED_date和INITIAL_NAME(您可以以非常低的成本优雅地实现SCD3(新列))

    更新有效期至当前日期

    如上所述,出于实际原因,历史维度通常会实现VALIDTO date。此列在ETL作业中维护,日常快照的一个可能解决方案是将其设置为

    • 开放版本的虚拟lagre日
    • 有效期的前一天到下一版本的前一天
    请注意,还有其他选项,但此模式的最大优点是,您始终可以使用此谓词查询正确的版本

     where to_date('01012015','ddmmyyyy') between validfrom_date and validto_date
    
    我在这里通过以下查询添加VALIDTO日期

     create table department_history2 as 
     with dept as (
     select  
     DEPARTMENTKEY, VERSION, VALIDFROM_DATE, 
     lead(VALIDFROM_DATE-1,1,to_date('31122500','ddmmyyyy')) over (partition by DEPARTMENTKEY order by VERSION) as VALIDTO_DATE,
     DEPARTMENTID, NAME, SEPC, START_DATE, END_DATE, IS_ACTIVE
     from Department_history
     )
     select * from dept
    
    更新查询每天的计数

    要从历史维度重建每日计数,必须首先 创建时间维度的相关部分(每天一条记录),然后将其加入历史维度。最后执行聚合

    以下是从2015年8月30日起4天“减压”的示例

     with snapshots as (
     select to_date('30082015','ddmmyyyy') -1 + rownum transaction_date from dual connect by level <= 4),
     deps_snaps as (
     select 
      transaction_date, DEPARTMENTKEY, VERSION, VALIDFROM_DATE, VALIDTO_DATE,      DEPARTMENTID, NAME, SEPC, START_DATE, END_DATE, IS_ACTIVE
     from   department_history2, snapshots
     where transaction_date between  validfrom_date and validto_date
     )
     -- aggregate
     select transaction_date, count(*) active_dept_count
     from deps_snaps
     where is_active = 'Y'
     group by transaction_date
     order by transaction_date;
    
     transaction_date     active_dept_count
     30.08.2015 00:00:00    2
     31.08.2015 00:00:00    2
     01.09.2015 00:00:00    1
     02.09.2015 00:00:00    1
    
    将快照作为(
    
    从dual connect按级别选择to_date('30082015','ddmmyyyy')-1+rownum transaction_date您存储的事实是什么,以及它们的可测量属性?感谢David,所需的度量是任何给定时间的员工数和部门数,因此事实表实际上可能是“无事实的”,因为它可以只存储:日期、员工id、部门id?是否对员工、部门或总体就业情况进行分类(到目前为止的就业天数、工作id?)等等,您希望能够测量或筛选?确切地说,这只是员工属性和部门属性随时间的变化。因此,我应该使用无事实真相表方法吗?像这个EmployeeKey、DepartmentKey、DateKey知道客户要求的窗口为5年,所以每da重复700万条记录是正确的吗在无事实的表格中,你有5年的时间吗?我认为这取决于你实际需要报告的内容。如果只是按日期统计每个部门的员工数量,那么你可以有DepartmentKey、DateKey、employee_count。如果你需要随时间跟踪一群员工的部门(向我展示1月1日参与客户服务的所有员工的当前部门)然后,您需要在事实表中跟踪员工id。非常感谢您的回答,他们需要每日快照,因为他们需要每天的员工计数,并且他们希望能够每天向下钻取和钻取员工属性。部门也是如此。我已经将员工和部门用作t的维度事务和业务流程事实表。问题是,他们需要部门和员工的每日计数,以及在任何给定日期从一个部门向下钻取到另一个员工的能力。阅读构建维度层次结构,您将了解如何允许向下钻取。对于计数,只需在事实表w上启动一个查询通过适当的日期范围,您可以获得任何一天/月的计数HI Marmite,非常感谢您的贡献。他们希望获得员工或部门的计数