我正在实施一个基本的星型模式,为我的公司提供购买报告。我们的事实表总结为4个维度,并与每日,每周,每月和每年总计汇总。
该代码目前知道如何处理单天,几周,几个月和几年的报告。下一步是实施任意日期范围报告。提供范围,目标是了解两个日期之间的年,月,周和天的总数,并拉到适当的记录来计算总数。问题是我们需要确定两个日期之间每个完整粒度周期的计数,而不仅仅是经过的时间量。
例如,“2009-06-29”和“2011-06-29”之间已过去2年,但我们需要知道此范围包括一整年(2010年),11个月(1月至5月) / 10& Jul-Dec / 09)和58天(Jun 1-29 / 09& Jun 1-29 / 11)。
从这个结果我们可以从70个粒度周期中提取已经汇总的记录,合并并呈现总计。
我一直在编写测试代码,以确定将日期范围分解为其组成部分的最佳方法,但我正在退步,因为我怀疑我正在过度思考这个过程。目前的草案如下:
理论上,这应该递归地将初始日期范围缩小到一整年,几个月,几周和几天的集合。
有更好的方法吗?这似乎是一个以前已经解决过很多次的问题。
答案 0 :(得分:1)
我不明白为什么要实现这样一个复杂的解决方案,通常的实现是只有一个事实表,其中数据的粒度最低(在你的情况下是每天),而简单的是SUM()根据需要在您的查询中进行衡量。
实现和维护非常简单,查询非常容易编写(或从报告工具生成)。这不适合你吗?你有多少数据?您是否已将日期实现为维度(希望是)或作为事实表中的值?您使用报告工具(SSRS,Cognos,Business Objects)还是滚动自己的查询?
如果您正在考虑性能问题,那么DWH就像这样发展是很常见的:
您的解决方案听起来有点像自制的OLAP实现,但不清楚为什么需要它。如果您的数据量小到中等,您可能能够通过索引和分区来很好地管理它。如果它很大,那么你可能正在考虑使用OLAP和专业的报告工具,这将是一个更广泛的问题。但是你没有提供有关你的环境或要求的更多信息,所以我可能在这里不合时宜。