我正在我的数据仓库中建立一个时间维度。我已经有了日期维度。
我如何表示未知时间?在我的DimDate维度中,我将01/01/1753标记为未知日期,但我认为时间会更难。我们的事实表中不允许使用NULL。我该怎么做,这行可能是什么样的?
答案 0 :(得分:1)
您声明“事实表中不允许NULL”,但询问“我如何表示未知时间?”
假设您在FACT表中使用的是TIME类型的数据,并且对从源系统到达的数据强制执行NOT NULL约束=>您根本无法在事实中插入未知\无效时间,因此应该没有问题。 >
上述明显的例外是源系统报告的无效商业明智值,例如建议的Sunil('00:59:59.9999999'),但这是非常不常见且不稳定的解决方案,原因很明显(更改需求可以轻松地将此值转换为有效值)
如果您选择允许(并且我希望您这样做)来自源系统的带有NULL值或无效日期的记录来输入事实,那么最佳做法是在DimTime上使用代理键并将其作为FK插入到FACT中表格–这样可以轻松地在维度中表示有效值和无效值。 这种方法还可以轻松地支持采用无效的商业明智值('00:59:59.9999999')的方法,这样的值将获得FK_DimTime = -1。
我强烈建议 允许源系统中的特定类型的垃圾 进入FACT(即–无效\缺少\ NULL日期\时间值)表,直到您可以在相关的DIM中清楚地标记它,因为这会促使用户提高源系统中的数据质量。
这件事有一些背景 https://www.kimballgroup.com/1997/07/its-time-for-time/ https://www.kimballgroup.com/2004/02/design-tip-51-latest-thinking-on-time-dimension-tables/
答案 1 :(得分:0)
它看起来像你想要的任何东西。大多数尺寸都有某种“显示名称”,因此您的尺寸可能如下所示:
create table dbo.DimDate (DateID int, DateValue date, DisplayDate nvarchar(20))
go
-- this is an unknown date; 1753-01-01 is only there because we need some valid date value
insert into dbo.DimDate values (1, '1753-01-01', 'Unknown')
go
-- this is the real date 1 Jan 1753
insert into dbo.DimDate values (2, '1753-01-01', '01 Jan 1753')
go
create table dbo.DimTime (TimeID int, TimeValue time, DisplayTime nvarchar(20))
go
-- this is an unknown time; 00:00 is only there because we need some valid time value
insert into dbo.DimTime values (1, '00:00', 'Unknown')
go
-- this is the real time value for midnight
insert into dbo.DimTime values (2, '00:00', 'Midnight')
go
当然,这假设您的报告工具和用户使用DisplayDate
和DisplayTime
列进行过滤,而不是直接过滤DateValue
和TimeValue
列,但这只是无论如何,需要了解培训和标准以及您采用的任何解决方案。
还有其他替代方法,例如未知值的标志列,或负TimeID
表示未知值的约定。但在我看来,那些不那么显而易见,维护比明确的行值更难。
答案 2 :(得分:0)
只需使用DimTime
技术代理键创建-1
条记录,然后在时间栏中填入值00:59:59.9999999
'。通过DWH,这将是一个不太可能的时间(精确到最后一个数字),当你想要过滤时,它总是等于报告或查询中的未知数,
EventTime < @ReportTime AND EventTime <> '00:59:59.9999999'
希望这是解决问题的可行方法。