在 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%,看看是否会加快速度。如果那没有超时,请重新添加更多以了解有多少组合是失败点。
使用完整数据集加快速度:
- 在拖动度量之前,您可以在枢轴 table 中过滤到 stores/weeks 的子集。这通常会比先拖动度量然后添加过滤器更快地获得结果。 (这并不是对您的衡量标准的真正改变,而是对您模型的用户的更多行为改变)。
- 您可能需要考虑在比周更高的级别(例如月)进行分组,以减少必须迭代的组合数量
- 如果您运行宁 Excel 32 位,或者只有 4GB RAM,请考虑 64 位 Excel and/or 更强大的机器(我怀疑是这种情况,但为了全面起见,我将其包括在内 - Power Pivot 可能会占用大量资源)
- 如果您可以将模型移动到 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 及其不同的计数。
我希望其中一些有用(或者您已经用其他方法解决了问题)。
我正在尝试计算 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%,看看是否会加快速度。如果那没有超时,请重新添加更多以了解有多少组合是失败点。
使用完整数据集加快速度:
- 在拖动度量之前,您可以在枢轴 table 中过滤到 stores/weeks 的子集。这通常会比先拖动度量然后添加过滤器更快地获得结果。 (这并不是对您的衡量标准的真正改变,而是对您模型的用户的更多行为改变)。
- 您可能需要考虑在比周更高的级别(例如月)进行分组,以减少必须迭代的组合数量
- 如果您运行宁 Excel 32 位,或者只有 4GB RAM,请考虑 64 位 Excel and/or 更强大的机器(我怀疑是这种情况,但为了全面起见,我将其包括在内 - Power Pivot 可能会占用大量资源)
- 如果您可以将模型移动到 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 及其不同的计数。
我希望其中一些有用(或者您已经用其他方法解决了问题)。