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 ║
╚═══════════════╩══════════════╩══════╩══════╩═══════════╩═════════╩════════╝
我正在使用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,非常感谢您的贡献。他们希望获得员工或部门的计数