【问题标题】:How to do bitwise operations in SSAS cube for aggregations using MDX如何在 SSAS 多维数据集中进行按位运算以使用 MDX 进行聚合
【发布时间】:2014-08-21 16:27:45
【问题描述】:

我想为我们的用户建模一个事实表,以帮助我们计算 DAU(每日活跃用户)、WAU(每周活跃用户)和 MAU(每月活跃用户)。 这些措施的定义如下: 1. DAU 是过去 28 天内每天活跃的用户。 2. WAU是过去28天内每7天至少有1天活跃的用户 3. MAU 是在过去 28 天内至少活跃 20 天的用户

我已经用我的事实表和用户维度表构建了一个 SSAS 多维数据集,如下所示

事实:{ 日期、用户 ID、活动名称} 维度:{日期、user_id、性别、年龄、国家/地区}

现在我想在这些数据上构建一个多维数据集,以便我们可以查看过去 28 天任何一天的所有度量。

我最初想在 SQL 服务器中为所有用户存储 28 天的数据,然后对日期进行不同的计数,以查看他们属于哪些度量值。但事实证明这非常昂贵,因为每天的数据量很大。几乎1000 万行。

所以我的下一个想法是对事实表进行建模(在将其移至 SQL 之前),使其具有一个名为“active_status”的新列,它是一个 32 位二进制类型列。

基本上,我将存储一个二进制数(或等效十进制数),例如 11000001101111011111111111111,它在用户处于活动状态的日子设置了一个位,在用户不活动的日子设置了一个位。

这样我可以在一天内压缩 28 天的数据,然后再加载到数据集市 现在的问题是,我认为 MDX 不支持像常规 SQL 那样对计算成员的表达式中的列进行按位运算。我希望使用 MDX 创建计算度量 daily_active_users、weekly_active_users 和monthly_active_users,它查看用户的这个 active_status 位并执行按位运算来确定状态。

关于如何解决这个问题的任何建议?如果 MDX 不允许按位,我还能做些什么 SSAS 来实现这一点。

感谢您的帮助

补充说明: @弗兰克

有趣的想法是使用视图进行从位集到维度类别的转换..但我担心它不会起作用。因为我很少有维度连接到具有多对多关系的事实表......例如:我有一个名为 DimLanguage 的维度和另一个名为 DimCountry 的维度,它们具有多对多关系。最终我想在多维数据集中做的是根据维度组合计算 COUNT(DISTINCT UserId) 的 DAU/WAU/MAU。所以对于前;如果用户不是维度国家 US 的 MAU,因为他在 28 天中只有 15 天处于活动状态......但他将被考虑

【问题讨论】:

  • 我是否正确理解单个用户的修复类别为 DAU、WAU 或 MAU,并且这与日期无关?或者您是否希望为用户提供此位集,代表过去 28 天到今天为止的每一天?
  • no.. 一个用户可以同时是 DAU 和 WAU 和 MAU。是的,我想要代表过去 31 天到今天的每一天的用户位集。 MAU 定义将来可能会从 28 天变为整个月,即 31 天,因此我想将其保持在 31

标签: sql ssas mdx olap-cube


【解决方案1】:

您不想向多维数据集的用户显示位图数据,而只是 DAU、WAU、MAU 类别,您应该在数据加载时间上进行从位图到类别的转换。只需创建一个包含 e 的维度表。 G。以下数据:

id category
-- --------
 1 DAU
 2 WAU
 3 MAU

然后在您的事实表上定义一个评估位图数据的视图,并为每个用户和每个日期计算用户所在类别的 id 值。这在概念上是维度表的外键。使用此视图代替多维数据集中的事实表。

因此,所有位图评估都是在关系端完成的,在这里您可以使用位运算符。

编辑 由于您的要求是您需要使用按位OR 作为聚合方法在 Analysis Services 中聚合位图数据,我认为没有简单的方法可以做到这一点。

但是,您可以做的是拥有 28 个单列,例如 Day1Day28,它们可以是 0 或 1。这些可以是 byte 类型以节省一些空间。您将使用Maximum 作为聚合方法,这相当于单个位上的二进制或。

然后,计算最终度量值并不复杂,因为我们知道值是零或一,因此我们可以对天求和:

CASE
    WHEN Measures.[Day1] + ... + Measures.[Day28] = 28 THEN 'DAU'
    WHEN Measures.[Day1] + ... + Measures.[Day7] >= 1 AND 
         Measures.[Day8] + ... + Measures.[Day14] >= 1 AND
         Measures.[Day15] + ... + Measures.[Day21] >= 1 AND
         Measures.[Day22] + ... + Measures.[Day28] >= 1 THEN 'WAU'
    WHEN Measures.[Day1] + ... + Measures.[Day28] >= 20 THEN 'MAU'
    ELSE                                                     'Other'
END

CASE 中子句的顺序是相关的,因为采用第一个条件匹配,并且您对 WAU 和 MAU 的定义有一些交集。

如果您最终测试了所有内容,则可以使度量 Day1Day28 不可见,以免混淆立方体的用户。

【讨论】:

  • ............但他将被认为是活跃的语言英语,因为它在美国和英国两个国家使用......所以他在美国活跃了 15 天,在美国活跃了 13 天英国......即使他不是分别针对每个国家/地区,他也将被视为该语言的 MAU。有几个这样的维度。因此,当消费者选择维度组合时,我需要通过沿所有选定维度对位集进行“或”运算,然后检查每个用户的总不同活动天数是否满足每个用户的标准,从而即时计算这些度量。措施。希望这是有道理的?
  • 感谢弗兰克的建议。我会试一试。一个 Q,正如我所说,一个给定的用户可以同时是 DAU 和 WAU 和 MAU,或者只是其中之一或只有其中两个。那么在这种情况下这个 CASE 语句将如何工作
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多