在Dax中有效计算DISTINCTCOUNT的平均值?

时间:2016-11-10 16:57:22

标签: powerpivot powerbi dax

我试图计算DAX中的业务逻辑,结果证明资源非常庞大且复杂。我有一个非常大的PowerPivot模型(称之为"销售"),有许多维度和措施。销售模型的简化视图:

+-------+--------+---------+------+---------+-------+
| State |  City  |  Store  | Week | Product | Sales |
+-------+--------+---------+------+---------+-------+
| NY    | NYC    | Charlie |    1 | A       | $5    |
| MA    | Boston | Bravo   |    2 | B       | $10   |
| -     | D.C.   | Delta   |    1 | A       | $20   |
+-------+--------+---------+------+---------+-------+

基本上我尝试做的是按商店和周计算产品的DISTINCTCOUNT:

SUMMARIZE(Sales,[Store],[Week],"Distinct Products",DISTINCTCOUNT([Product]))

+---------+------+-------------------+
|  Store  | Week | Distinct Products |
+---------+------+-------------------+
| Charlie |    1 |                15 |
| Charlie |    2 |                 7 |
| Charlie |    3 |                12 |
| Bravo   |    1 |                20 |
| Bravo   |    2 |                14 |
| Bravo   |    3 |                22 |
+---------+------+-------------------+

然后,我想在商店一级计算这些不同产品的平均值。我接近这个的方法是先进行计算,然后在它上面运行一个SUMX并将它除以不同的周数:

SUMX(
SUMMARIZE(Sales,[Store],[Week],"Distinct Products",DISTINCTCOUNT([Product]))
,[Distinct Products]
) / DISTINCTCOUNT([Week])

+---------+------------------+
|  Store  | Average Products |
+---------+------------------+
| Charlie | 11.3             |
| Bravo   | 18.7             |
+---------+------------------+

我将这个计算存储在一个度量中,当数据集较小时它运行良好。但是现在数据集非常庞大,当我尝试使用该测量时,它会挂起,直到我必须取消该过程。

有更有效的方法吗?

1 个答案:

答案 0 :(得分:2)

SUMX在这种情况下是合适的,因为您希望为每个商店和每个商店独立计算不同的产品数量。每个星期,然后由商店汇总,然后除以商店的周数。没有办法解决这个问题。 (如果有的话,我会推荐它。)

但是,SUMX是一个迭代器,因此可能导致速度减慢。由于我们无法完全消除SUMX,因此这里最大的因素是您拥有的商店/周的组合数量。

要确认商店/周的组合数量是否是减速的来源,请尝试过滤或从数据模型的副本中删除50%,看看是否加快了速度。如果没有超时,请重新添加更多内容,以了解失败点的组合数量。

使用完整数据集加快速度:

  1. 在拖动度量之前,您可以在数据透视表中过滤到商店/周的子集。这通常比首先拖动度量,然后添加过滤器获得更快的结果。 (这不是对您的度量的真正改变,而是对模型用户的更多行为改变)。
  2. 您可能需要考虑比周(例如月)更高级别的分组,以减少必须迭代的组合数
  3. 如果您运行的是Excel 32位,或者只有4GB的RAM,请考虑使用64位Excel和/或更强大的机器(我怀疑是这种情况,但包括全面性 - Power Pivot可以是资源匮乏)
  4. 如果您可以将模型移动到Power BI Desktop(我不相信Power Pivot支持计算表),您可以将SUMMARIZE提取到计算表中,然后重新编写您的度量以引用计算的而是表。这减少了测量必须在运行时执行的计算次数,因为存储/周的所有组合加上产品的不同计数将被预先计算(仅留下您的度量的求和和除法 - a很少工作)。
  5. Calculated Table =
    SUMMARIZE (
        Sales,
        [Store],
        [Week],
        "Distinct Products", DISTINCTCOUNT ( Sales[Product] )
    )
    

    注意:上面计算的表格代码是基本的,主要是作为概念证明。如果这是您所采用的路径,则您需要确保具有单独的商店维度以将计算表连接到,因为这不会直接连接到源表

    Measure Using Calc Table =
    SUMX (
        'Calculated Table',
        [Distinct Products] / DISTINCTCOUNT ( 'Calculated Table'[Week] )
    )
    

    杰森·托马斯(Jason Thomas)在计算表格上发表了一篇很棒的文章,以及它们何时可以在这里发挥作用:http://sqljason.com/2015/09/my-thoughts-on-calculated-tables-in.html

    如果您不能使用计算表,但您的数据来自某种形式的数据库,那么您可以在SQL中执行相同的逻辑,然后导入预先准备的独立存储/月份的独立表及其独特的计数。

    我希望其中一些证明有用(或者你以另一种方式解决了问题)。

相关问题