首页 > 解决方案 > 类别内的 DAX RANKX

问题描述

如何计算类别内的排名?假设我们有具有以下预期结果的样本数据:

在此处输入图像描述

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcisqzSwpVtJRSiwoyEkF0oZgHKuDJJWUmAeEQIYJEBuhypXn56QlpRYVVQLZpkBsjCqdnAGVMwNrB8mFpaanliQm5aSC5AvySxJL8lGsRZFPTiwqyi8BWwuzGkU+Py8zPw9Im0OsjgUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Category = _t, Subcategory = _t, Sales = _t, Results = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Category", type text}, {"Subcategory", type text}, {"Sales", Int64.Type}, {"Results", Int64.Type}})
in
    #"Changed Type"

我在那里漫游寻找提示。根据那里显示的模式,我能够编写以下代码:

Rank within category =
RANKX (
    FILTER (
        ALL (
            'MyTable'[Category],
            'MyTable'[Subcategory]
        ),
        'MyTable'[Category]
            = MAX ( 'MyTable'[Category] )
    ),
    CALCULATE (
        SUM ( 'MyTable'[Sales] )
    )
)

上面的代码产生了预期的结果,但我不知道它是如何工作的。你能解释一下吗?

更新。

我在这里找到了另一种简单的方法,它有几行优雅的线条,但同样,它的工作逻辑对我来说仍然是一个令人费解的谜语。你能解释一下吗?

Rank within category using variables = 

VAR TotalSalesThisItem = [SalesMeasure] // a variable to hold each item's sales

// now count how many items have sales which match or exceed this
RETURN
    COUNTROWS (
        FILTER (
            ALL ( MyTable[Subcategory] ),
            [SalesMeasure] >= TotalSalesThisItem
        )
    )

这段代码的神秘之处在于它如何知道类别是什么?代码仅提及子类别列。然而,它产生了预期的结果。

标签: powerbidax

解决方案


老实说,要完成您想要的事情,这似乎非常复杂且不直观。我重新创建了您的表格(感谢您包含 M 代码!)并编写了以下计算表格:

Ranked =
RANKX (
    FILTER (
        Table5,
        Table5[Category]
            = EARLIER ( Table5[Category] )
    ),
    Table5[Sales],
    ,
    ASC,
    DENSE
)

这将提供与结果列相同的输出。这里发生的事情是我给它一个改变的表,基于一个 FILTER 语句,我将 RANKX 操作限制为该类别的所有行。EARLIER() 指的是计算中上一级的列(它针对每一行进行评估,使用 EARLIER 您可以引用该行上的不同列)。

如果这对您有帮助,请将其标记为解决方案:)


推荐阅读