数据仓库 - 随时间存储唯一数据

时间:2017-08-24 17:16:50

标签: sql sql-server tsql sql-server-2012 data-warehouse

基本上我们正在为我们的软件构建报告仪表板。我们让客户能够查看基本的报告信息。

示例:(我已经从这个示例中删除了99%的实际系统复杂性,因为这仍然可以解决我尝试做的事情)

一个示例指标是......在特定时间段内查看的独特产品的数量。 AKA,如果客户在一个月内每次查看5件产品100次。如果您运行该月份的报告,则只需对所查看的产品数量说明5。

是否有关于如何以可以在任何时间范围内查询数据的方式存储数据的任何建议,并返回所查看产品的唯一数量。为了这个例子...假设有一个规则,应用程序不能直接查询源表,我们必须将摘要数据存储在不同的数据库中并从那里查询。

作为旁注,我们存储了大量其他指标,我们按天汇总存储。但是由于唯一性问题,这个特定的指标是不同的。

我个人认为不可能。我们目前的解决方案是,我们提供4个预先计算的时间范围,其中受唯一性影响的指标可用。如果您使用自定义时间范围,则该指标不再可用,因为我们没有预先计算数据。

2 个答案:

答案 0 :(得分:0)

您的问题是您正在尝试更改事实表的粒度。这是不可能做到的。

我认为你现在正在做的最好的选择是 - 在一天,一周和一个月定义聚合事实表,以支持你的性能约束。

您可以通过建议用户这将比标准聚合更慢来解决自定义时间范围。例如,想要知道星期二销售的独特产品数量的用户可以写一个这样的查询,但会牺牲一些性能损失:

select  distinct dim_prod.pcode
        ,count(*)
from    fact_sale
        join dim_prod on dim_prod.pkey = fact_sale.pkey
        join dim_date on dim_date.dkey = fact_sale.dkey
where   dim_date.day_name = 'Tuesday'
group by dim_prod.pcode

查询也可以针对每日汇总而非事务性事实进行编写,因为它会扫描较少的数据,但运行速度更快,甚至可能满足您的需求

答案 1 :(得分:0)

根据您提供的信息,我认为您正在尝试衡量“一个月内查看的独特产品数量(例如)”。

不确定您是否使用Kimball方法来设计事实表。我相信Kimball方法,建议使用累积快照事实表来满足这样的要求。

我可能正在转变(在这种情况下道歉),但如果没有,那么我会让你通过以下链接,专家已经详细解释了这个概念: http://www.kimballgroup.com/2012/05/design-tip-145-time-stamping-accumulating-snapshot-fact-tables/

我还提供了另一个来自Kimball的链接,它详细解释了不同类型的事实表:

http://www.kimballgroup.com/2014/06/design-tip-167-complementary-fact-table-types/

希望能够详细解释这些概念。非常乐意回答任何问题(尽我所能)

干杯 尼西