特别是我正在处理类型2 缓慢变化的维度,并且需要表示特定记录活动的时间间隔,即对于每个记录我有一个StartDate和一个EndDate.我的问题是关于是否使用闭合([StartDate,EndDate])或半开([StartDate,EndDate))间隔来表示这一点,即是否包括间隔中的最后日期.举一个具体的例子,说记录1从第1天到第5天是活跃的,从第6天开始记录2变得活跃.我是否将记录1的EndDate设为等于5或6?
最近我开始思考半开放区间最好基于Dijkstra:为什么编号应该从零开始,以及Python中的数组切片和range()函数的约定.在数据仓库上下文中应用它我会看到半开区间约定的优点如下:
因此,我倾向于采用半开区间法.然而,如果有一些广泛采用的使用闭区间方法的行业惯例,那么我可能会倾向于顺其自然,特别是如果它是基于实现这种系统的实际经验而不是我的抽象理论.
提前感谢任何见解或评论.
我们使用第三方产品来管理我们的体育中心会员资格.我们有几种会员类型(例如,初级,学生,员工,社区)和几种会员身份(例如,年度,活动,非活动,暂停).不幸的是,该产品仅记录会员当前的会员类型和状态.我希望能够跟踪我们的会员类型和状态随时间变化的方式.
目前,我们可以访问产品的数据库设计.它在SQL Server上运行,我们定期针对产品表运行自己的SQL查询,以生成我们自己的表.然后,我们将表格链接到Excel中的数据透视表以生成图表.所以我们熟悉数据库设计和SQL.但是,我们仍然坚持如何最好地解决这个问题.
该产品记录会员的会员购买情况以及他们的开始和到期日期.因此,我们可以回过头来确定会员在任何时间点的类型和状态.举例来说,如果他们买了在2007年1月1日,一个初级会员,并于2007年12月31日到期,那么他们买了2008年6月1日,一个学生会员,我们可以看到他们的状态,从主动去激活到激活(于扬分别于2008年1月和2008年6月1日),他们的类型从初中到学生(2008年6月1日).
基本上我们希望将成员的类型和状态属性转换为时间属性或有效性 a-la Fowler(或其他随时间变化的事物).
我们的问题(最后:) - 鉴于上述情况:您建议我们使用什么数据库表设计来保存此成员信息.我想它会有一个MemberID列,所以我们可以键入现有的Member表.它还需要存储成员的状态和类型以及他们所持有的日期范围.我们希望能够轻松地针对此表编写查询,以确定在给定时间点我们拥有的每种类型和状态的成员数量.
更新2009-08-25:已经进行了侧面跟踪,并且还没有机会尝试提出的解决方案.希望尽快这样做,并根据结果选择答案.
我的直觉告诉我,开始时间和结束时间总的来说比开始时间和持续时间要好,但我想知道不同的方法是否有一些具体的优点或缺点.
我所看到的strttime和endtime的优势在于,如果您想在特定时间段内调用所有活动的事件,则不必在该时间段之外查看.
(这适用于初始输入后不太可能发生很大变化并且与特定时间相关的事件,如果这会产生影响)
我在这个查询的另一个问题的答案中,在PerformanceDBA的声明中提出这个问题:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND DateTime = ( -- Current Status on the left ...
SELECT MAX(DateTime) -- Current Status row for outer Product
FROM ProductStatus ps_inner
WHERE p.ProductId = ps_inner.ProductId
)
Run Code Online (Sandbox Code Playgroud)
使用ProductStatus表只保存状态随时间变化的有效(开始)日期,将超过此查询:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND getdate() BETWEEN DateFrom AND Dateto …Run Code Online (Sandbox Code Playgroud)