如何在 SQL 服务器数据仓库中提供 YTD、12M 和 Annualized 度量?

How to provide YTD, 12M, and Annualized measures in SQL Server data warehouse?

项目需要 SQL 服务器 table 中的可用数据仓库 (DW)。他们不喜欢分析服务,SQL 服务器 DW 提供他们需要的一切。

他们开始使用 PowerBI,并表示希望在 SQL 服务器 table 中提供所有事实和度量,而不是多维立方体。客户端也使用过SSRS(很大程度上),还有一些Excel(用户)。

起初他们只需要 收入 FACT 期间 x 产品 x 地点。这使用周期性快照类型的事实,而不是事务粒度事实。

那么,为了提供所有时期的 YTD 指标,我的第一个挑战是填写 "empty" 事实,其中没有收入,但之前有收入(and/or随后)期间。空事实 table 包含一个 YTD 度量列。

我通过为无收入期创建空事实(无收入)解决了这个问题,例如:

Period 1, Loc1, Widget1,  revenue,  YTD
Period 2, Loc1, Widget1, [=11=] revenue,  YTD (this [=11=] "fact" created for YTD)
Period 3, Loc1, Widget1,  revenue,  YTD

我仅以 YTD 为例,但除了 YTD 之外,要求还包括过去 12 个月和年化指标。

我发现统计 YTD 的最佳方法实际上是创建记录来保存度量值 (YTD),其中没有来自交易数据的事实(意思是:该维度组合没有收入)。

现在,需求需要另外两个维度(市场细分和客户)的收入事实。这意味着我需要重构我现有的存储过程来执行相同的过程,但现在要了解更详细的事实:

Period x Widget x Location x Market x Customer

这将导致创建更多记录来保存 YTD(和其他)度量。这些措施的记录将比实际情况多得多。

以下是我认为可能的解决方案:

  1. 只需在 SQL DW table(s) 中完成即可。这使得它可以在任何需要的地方轻松使用。 (就像现在一样)
  2. 在 Power BI 中执行此操作——假定 PBIX 中的 DAX 表达式?
  3. SSAS 表格 -- 表格是否适合计算 YTD 等措施,还是应该在报告层处理?

无论价值如何,客户都不愿意使用 SSAS 表格,因为他们希望将层数保持在最低限度。

跟进问题:

首先,SSAS Tabular 和 Power BI 使用相同的引擎。所以它们同样适用。

使用大量分类属性中的任何一个来定义可以跨数据的任何部分计算的度量的能力是您想要在您的面前使用 SSAS Tabular 或 Power BI 之类的东西的主要原因之一SQL服务器。 (其他的是缓存、简化的最终用户报告、跨源混合数据的能力以及自定义安全性。)

理想情况下,SQL 服务器应提供事实,以及到任何维度 table 的单列连接,包括日期维度 table。 Power BI / SSAS Tabular 然后将在 DAX 度量定义、过滤器流行为和可能的行级安全性上分层。

这是我的经验:

我一直坚持 DW 应该是你所有数据所在的地方。然后 任何 客户端工具都可以使用该 DW 并得到相同的答案。

我在最近的项目中遇到了同样的问题:生成 "same day last year" 类型的计算(以及 YTD、Fin YTD 等)。 SQL 服务器似乎是放置这些 'sparse' 事实的明显位置,但正如我发现的那样(正如你所发现的那样)随着维度的增加,稀疏性变得越来越大,越来越复杂,你最终会崩溃大小 不断返回并追查那些缺失的稀疏事实,最糟糕的是不得不想出奇怪的 'allocation' 规则来将措施降低到要求的水平详情

恕我直言,DAX 是做这件事的地方,但学习这门语言有很多痛苦,尤其是你们来自传统的关系背景。但我确实认为这是自 SQL 以来最好的事情,如果你能克服学习曲线。

使用 DAX 而不是 DW 的最明显优势之一是,DAX 可以在 运行 时间并且可以自动调整它的计算。显然你不能用 DW 中的数字来做到这一点。例如,您可以识别在给定日期筛选的人物、图表或行,因此您当前的 year/prior 计算会根据日期自动计算正确的 YTD。

DAX 有许多 'calendar' 类型的函数(称为 "time intelligence"),但它们只适用于特定类型的日历并且有很多 constraints,所以通常您最终需要创建自己的日历 table 并围绕该日历构建函数 table.

我的建议是从这里开始:https://www.daxpatterns.com/ 并尝试在 DAX 中生成一些 YTD 计算

For what it's worth, the client is reluctant to use SSAS Tabular because they want to keep the number of layers to a minimum.

Power BI 已经有一个(必需的)建模层,可以在内部有效地使用 SSAS 表格,因此您已经 有一个额外的逻辑层。它与报告层位于同一工具中。不同之处在于,目前仅在 Power BI 中进行建模不是 "Enterprise" 方法。 Power BI 不支持模型版本控制、分区加载、高级行级安全性等功能(尽管谁知道下个月会带来什么)

图层不是坏事,只要你能控制它们。否则我们应该回到单一的 Cobol 程序。

当然可以开始完全在 Power BI 中进行建模,然后在稍后阶段当您需要功能、控制和可扩展性时,迁移到 SSAS 表格。

需要考虑的一件事是 Azure 中的 SSAS Tabular PaaS 产品可能非常昂贵,但如果您需要分区加载(即将本周的数据加载到具有大量历史记录的非常大的立方体中),您你会需要用到它的。

Is there a SQL Server architecture to provide this sort of solution as I did it, maybe reducing the number of records necessary?

我猜该体系结构将在视图中定义记录。这有很多明显的缺点。有一个 'sparse' 指示符,但它只是优化了具有大量 NULL 的字段的存储,甚至可能并非如此。

If they use PowerBI for YTD, 12M, Annualized measures, what do I need to provide in the SQL DW, anything more than the facts?

你肯定需要一个综合日历table定义财政年度

Is this something that SSAS Tabular solves, inherently?

如果您只想按日历周期(1 月 1 日至 12 月 31 日)报告,则内置时间智能是 "inherent",但如果您希望按会计周期报告,则无法使用时间智能.不管怎样,您仍然需要定义 DAX 计算。他们可以真的