我想为我们的用户建模事实表,以帮助我们计算DAU(每日活跃用户数),WAU(每周活跃用户数)和MAU(每月活跃用户数)。 这些措施的定义如下: 1. DAU是过去28天内每天都活跃的用户。 2. WAU是指在过去28天内每7天至少有一天活跃的用户 3. MAU是在过去28天内至少活跃20天的用户
我使用我的事实表和用户维度表构建了一个SSAS多维数据集,如下所示
事实:{date,user_id,activity_name} 维度:{date,user_id,gender,age,country}
现在我想在此数据上构建一个多维数据集,以便我们可以查看过去28天内任何指定日期的所有度量。
我想最初为SQL服务器中的所有用户存储28天的数据,然后在日期计算明确的数据,看看它们属于哪些措施..但这证明非常昂贵,因为每天的数据很大。 1000万行。
所以我的下一个想法是对事实表进行建模(在将其移动到SQL之前),以便它有一个名为“active_status”的新列,它是一个32位二进制类型列。
基本上,我会存储一个二进制数(或十进制等效值),例如11000001101111011111111111111,它在用户处于活动状态时设置了一个位,在用户未处于活动状态时关闭。
这样我可以在加载到数据集市之前的一天内压缩28天的数据 现在的问题是,我认为MDX不支持像常规SQL那样对计算成员的表达式中的列进行按位运算。我希望使用MDX创建计算度量daily_active_users,weekly_active_users和monthly_active_users,MDX查看用户的active_status位并按位运算以确定状态。
有关如何解决此问题的任何建议?如果MDX不允许按位,我还能做什么SSAS来实现这一点。
感谢您的帮助
附加说明: @Frank
有趣的想法使用视图来进行从bitset到维度类别的转换..但我担心它不起作用。因为我有很少的维度连接到这个具有许多关系的事实表...例如:我有一个名为DimLanguage的维度和另一个名为DimCountry的维度,它们有很多关系。最后我想在立方体中做的是根据维度的组合计算DAU / WAU / MAU,它们是COUNT(DISTINCT UserId)。所以对于前如果用户不是维度国家美国的MAU,因为他只在28天中活动了15天......但他将被考虑
答案 0 :(得分:2)
您不希望向多维数据集的用户显示位图数据,只需要DAU,WAU,MAU类别,您应该在数据加载时从位图转换为类别。只需创建一个包含e的维度表。 G。以下数据:
id category
-- --------
1 DAU
2 WAU
3 MAU
然后在事实表上定义一个评估位图数据的视图,并为每个用户和每个日期计算用户所在类别的id值。这在概念上是维度表的外键。使用此视图而不是多维数据集中的事实表。
因此,所有位图评估都在关系方面完成,您可以在其中使用位运算符。
修改强>
根据您的要求,您需要使用按位OR
作为聚合方法来聚合Analysis Services中的位图数据,我认为没有简单的方法可以做到这一点。
但是,您可以做的是拥有28个单列,例如Day1
到Day28
,它们可以是0或1.这些列可以是byte
类型节省一些空间。您可以使用Maximum
作为聚合方法,这相当于单个位上的二进制OR。
然后,计算最终测量结果并不是很复杂,因为我们知道这些值是零或一,因此我们可以总结这些日期:
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的定义有一些交集。
如果您最终测试了所有内容,则会使Day1
到Day28
的度量不可见,以免混淆多维数据集的用户。