目前,我正在阅读Kimball的数据仓库书,同时,我正在考虑为以下示例设计一个数据仓库:
1:客户可以购买产品,这将生成发票,然后将生成库存行。注:库存行是一个累加表,即,如果他们订购数量为5的产品A,然后再订购5,则将有2个发票行和一个10个单位的库存行。
因此,基于所描述的场景,以下设计将是合适的: 1.客户维度2.产品维度3.日期维度3.发票事实4.库存事实
现在,假设我想找出像1这样的问题的答案。哪些客户目前的库存为零,但在过去3个月内生成了发票。还会有其他类似的问题。2.哪些客户有产品A但没有产品B
根据金波尔斯的书,似乎需要在两个事实表之间进行某种连接,比如子集?
这似乎相当低效,特别是两个事实表之间记录的绝对大小。这是正确的方法吗?
发布于 2019-01-07 11:39:01
哪些客户目前的库存为零,但在过去3个月内生成了发票。
SELECT C.*
FROM DimClient C
WHERE EXISTS (
SELECT * FROM FactInvoice I
WHERE C.ClientKey = I.ClientKey
AND InvoiceDate >= DATEADD(m,GetDate(),-3)
)
AND NOT EXISTS (
SELECT * FROM FactInventory V
WHERE InventoryLevel > 0
AND V.ClientKey = C.ClientKey
AND (Maybe a predicate to limit to current inventory only)
)哪些客户有产品A但没有产品B
SELECT C.*
FROM DimClient C
WHERE EXISTS (
SELECT * FROM FactInvoice I
WHERE C.ClientKey = I.ClientKey
AND I.ProductID IN (1,2,3)
)
AND NOT EXISTS (
SELECT * FROM FactInvoice I
WHERE C.ClientKey = I.ClientKey
AND I.ProductID NOT IN (4,5,6)
)这些查询是低效的吗?与对源系统运行相同的查询相比,效率并不低
实际上,您的源系统可能需要更多的表、更多的连接,并且可能需要更少的索引
星型模式的基础之一是它们针对分析进行了优化。
发布于 2019-01-07 05:45:36
根据金博尔的说法,这似乎是构建drilling-across的正确方法。他提到,为了正确地工作,应该将其设置为使用here和explained here定义的一致维度。不过,我不能说在这种情况下会有多高的效率/低效率。
https://stackoverflow.com/questions/54065957
复制相似问题