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

Calculating an average of a DISTINCTCOUNT efficiently in Dax?

我正在尝试计算 DAX 中的业务逻辑,结果证明它占用大量资源且非常复杂。我有一个非常大的 PowerPivot 模型(称之为 "sales"),其中包含许多维度和度量。销售模型的简化视图:

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

基本上我要做的是按商店和周计算产品的 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             |
+---------+------------------+

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

有没有更有效的方法来做到这一点?

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

但是,SUMX 是一个迭代器,因此可能是速度变慢的原因。由于我们不能完全消除 SUMX,这里最大的因素是您拥有的 stores/weeks 的组合数。

要确认 stores/weeks 的组合数量是否是减速的原因,请尝试从数据模型的副本中过滤或删除 50%,看看是否会加快速度。如果那没有超时,请重新添加更多以了解有多少组合是失败点。

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

  1. 在拖动度量之前,您可以在枢轴 table 中过滤到 stores/weeks 的子集。这通常会比先拖动度量然后添加过滤器更快地获得结果。 (这并不是对您的衡量标准的真正改变,而是对您模型的用户的更多行为改变)。
  2. 您可能需要考虑在比周更高的级别(例如月)进行分组,以减少必须迭代的组合数量
  3. 如果您运行宁 Excel 32 位,或者只有 4GB RAM,请考虑 64 位 Excel and/or 更强大的机器(我怀疑是这种情况,但为了全面起见,我将其包括在内 - Power Pivot 可能会占用大量资源)
  4. 如果您可以将模型移动到 Power BI Desktop(我认为 Power Pivot 不支持计算表),您可以将 SUMMARIZE 提取到计算的 table,然后重新编写您的衡量标准是参考计算出的 table。这减少了度量必须在 运行 时间执行的计算次数,因为 store/week 的所有组合加上产品的不同计数将被预先计算(只留下求和和除法)要做的措施 - 工作量少了很多)。

.

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

注意:上面计算的 table 代码是基本的,主要设计为概念验证。如果这是您采用的路径,您需要确保有一个单独的商店维度来加入计算的 table,因为这不会直接加入源 table

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

Jason Thomas 在计算 table 方面有很好的 post 以及它们何时可以在这里派上用场:http://sqljason.com/2015/09/my-thoughts-on-calculated-tables-in.html

如果您不能使用计算的 tables,但您的数据来自某种形式的数据库,那么您可以在 SQL 中执行相同的逻辑,然后导入一个预准备了单独的 table 个独特的 store/months 及其不同的计数。

我希望其中一些有用(或者您已经用其他方法解决了问题)。