我正在学习DAX,并对PowerBI中的RANKX()感到困惑。这是我的数据:
这是我的措施:
Rank = RANKX(
ALL(RankDemo[Sub Category]),
CALCULATE(SUM(RankDemo[My Value])))
Run Code Online (Sandbox Code Playgroud)
这是我的视觉效果:
RANKX()可以正常工作,但是必须在PowerBI字段设置中将字段[My Value] 求和:


如果我选择不汇总,排名将全部为1。有人可以解释吗?Sum与DAX中的RANKX()或CALCULATE()有什么关系。谢谢。
您遇到的问题与RANKX无关。问题出在所谓的“隐式度量”上-这是Power BI和Power Pivot中的一种(不幸的)常见的坏习惯。
Power BI中的数字字段可以充当2个角色:
当您将“我的值”放到没有任何计算的表中(“不汇总”)时,您在告诉Power BI您希望“我的值”充当过滤器。在Excel数据透视表中,它等同于将“我的值”放到“行”区域而不是“值”中。因此,表中的每一行现在都按“子类别+我的价值”分组,而不仅仅是“子类别”(换句话说,您已经将“我的价值” ”)。由于“子类别+我的值”的每种组合都是唯一的,因此您实际上是在对包含1条记录的表进行排名(这就是为什么它总是返回1)的原因。
当您为“我的价值”选择“总和”时,它不再是行过滤器-现在是一种度量。因此,您现在筛选上下文不是“子类别” +“我的值”,而是“子类别”,并且RANKX公式可以正常工作。您可以通过从表格中删除汇总的“我的价值”来轻松地看到这一点-RANKX度量仍将以相同的方式工作。
当您将此“ SUM”聚合用于“我的价值”时,就是在告诉Power BI隐式为您创建DAX度量(这就是为什么将其称为“隐式度量”)。每当将数字字段直接放入视觉对象时,都会发生这种情况。出于多种原因,这种有隐含的措施被认为是经验丰富的设计师的不良做法,例如:
一个解决方案是:
在您的示例中,我将创建一个显式的DAX度量:
Total Value = SUM(RankDemo[My Value])
Run Code Online (Sandbox Code Playgroud)
现在,您可以在模型中的任何地方使用它。您可以将其放到视觉效果中查看“我的价值”总和。或者您可以在RANKX度量中使用它:
Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])
Run Code Online (Sandbox Code Playgroud)
这种设计的好处是: