计算排名

已完成

RANKX DAX 函数是可用于计算排名的特殊迭代器函数。 其基本语法如下:

RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])

与所有迭代器函数相似,必须传入表和表达式。 (可选)可以传入排名值、设置订单方向或确定在关联值时如何处理排名。

顺序方向

顺序方向为“升序”或“降序”。 当对收入值等有利内容排名时,可能会使用降序排列,以使最高收入排在第一位。 当对客户投诉等不利内容排名时,可能会使用升序排列,以使投诉的最小编号排在第一位。 如果未传入 order 参数,则函数将使用 0(零)(用于降序顺序)。

处理关联

可以通过跳过排名值或使用密集排名来处理关联,这会在关联后使用下一个排名值。 如果未传入关联参数,则函数将使用“跳过”。 稍后,你将有机会在本单元中使用每个关联参数的示例。

创建排名度量值

将以下度量值添加到 Product 表:

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity]
)

将产品数量排名度量值添加到位于报表第 2 页的表视觉对象。 表视觉对象对自行车产品分类并显示数量(按降序数量订购产品)。

RANKX 函数将循环访问由 ALL DAX 函数返回的表。 ALL 函数用于返回模型表中的所有行或一个或多个列中的值,并且忽略所有筛选器。 因此,在这种情况下,它将返回一个表,该表包含 Product 表中所有 Product 列值。 RANKX 函数必须使用 ALL 函数,因为表视觉对象将按产品分组(这是 Product 表上的筛选器)。

在表视觉对象中,请注意,两个产品将与第十个位置相关联,下一个产品的排名为 12。 此视觉对象是使用“已跳过”关联参数的示例。

图像显示了一个名为“自行车销售”的表视觉对象。它分为三列:产品、数量和产品数量排名。表行按数量的降序排序。两个产品的排名均为 10,下一个产品的排名为 12。

下一项任务是输入以下逻辑,以修改“产品数量排名”度量定义,以使用密集排名:

Product Quantity Rank =
RANKX(
    ALL('Product'[Product]),
    [Quantity],
    ,
    ,
    DENSE
)

请注意,在表视觉对象中,跳过的排名已不再存在。 将两个产品关联到第十个位置之后,下一个排名为 11。

图像显示了一个名为“自行车销售”的表视觉对象。它分为三列:产品、数量和产品数量排名。表行按数量的降序排序。两个产品的排名均为 10,下一个产品的排名为 11。

请注意,“产品数量排名”的表视觉对象总计为一 (1)。 原因是因为所有产品的总数均已排名。

图像显示产品数量排名总计为 1。

这并不适合对总计产品进行排名,因此,你现在将使用以下逻辑修改度量值定义以返回 BLANK,除非筛选单个产品:

Product Quantity Rank =
IF(
    HASONEVALUE('Product'[Product]),
    RANKX(
        ALL('Product'[Product]),
        [Quantity],
        ,
        ,
        DENSE
    )
)

图像显示产品数量排名总计为 BLANK。

请注意,“产品数量排名”的合计现在为 BLANK,这是通过使用 HASONEVALUE DAX 函数来实现的,以测试 Product 表中的 Product 列在筛选器上下文中是否有单个值。 每个产品组都是这种情况,但代表所有产品的总计不是。

筛选器上下文和 HASONEVALUE 函数将在筛选器上下文模块中引入。