ONLY ONE度量值解决问题:并列排名

2022-01-05 09:21:18 浏览数 (3)

大家好,我是学谦,这里是PowerBI学前班

今天继续更新【ONLY ONE度量值】专题。

全文1500字,阅读需5min。

引言

RANKX函数大家都很熟悉了,可以用来做排名。

比如,有这么一个数据:

我们拖到表中做个RANKX,有两种写法:

代码语言:javascript复制
rankx1 = 
RANKX(
    CALCULATETABLE(
        VALUES(Data[Item]),
        ALL(Data[Item])
    ),
    CALCULATE(SUM(Data[Value]))
)

rankx2 = 
RANKX(
    CALCULATETABLE(
        VALUES(Data[Item]),
        ALL(Data[Item])
    ),
    CALCULATE(SUM(Data[Value])),
    ,
    ,
    Dense
)
//是否在第五个参数设置为dense

呈现结果:

rankx1是跳过了并列排名,比如从4个1直接跳到了5,而rankx2是不间断的排名,区别就在于rankx的第五参数dense。

两者都有不同的应用场景。

不过,今天要实现的目标是这样的,看最后一列,也就是并列排名中也有大小顺序,即去掉了并列排名:

今天将计算列写法和度量值写法都分享给大家,视情况进行选择。

计算列步骤

第一步:添加一列数值完全不同的辅助列,使用earlier或者var都可以:

代码语言:javascript复制
列 = countrows(filter('data','data'[Item]>earlier('data'[Item])))

第二步:再添加一列排名的索引,以便让并列排名的小数点后的数值也不相同:

代码语言:javascript复制
排名索引 = 'data'[Value] value(("0.0"&'data'[列]))

第三步:接下来我们只要对这一列排名索引进行rankx就可以了:

代码语言:javascript复制
rankx3 = 
RANKX(
    CALCULATETABLE(
        VALUES(data[Item]),
        ALL(data[Item])
    ),
    CALCULATE(SUM(data[排名索引]))
)

大功告成!

但是,还是那个问题,这样我们需要对模型添加2列额外的内容,会显得模型并不完美。

我们想通过不修改数据模型的前提下,进行不重复的排名。

也就是只使用一个度量值。

关注这一点的原因,也请大家再次参考这篇文章:

多用度量值,少用新建列:一个度量值解决分月均摊

度量值步骤

写度量值使用的办法与计算列可以说是完全一致,只不过所有的内容都是在度量值里进行:

代码语言:javascript复制
排名 = 
var index_table=//第一步:先给这个数据表新建一个index列
ADDCOLUMNS(
    ALL(data),//此处一定要用ALL,去掉列的筛选器
    "Index",
    var a=[Item] //在var中使用var,这个技能可以好好利用
    return COUNTROWS(FILTER(ALL(data),[Item]>=a))
)

var rankx_table1=//第二步:根据index列加成新建一列
ADDCOLUMNS(
    index_table,
    "new_col",
    [value] [Index]*0.01
)
var rankx_table2=//第三步:根据新建的列rankx
ADDCOLUMNS(
    rankx_table1,
    "rank1",
    rankx(rankx_table1,[new_col])
)
var rank_out=//第四步:根据选择的item确定rankx数字
MINx(
    FILTER(rankx_table2,[Item]=SELECTEDVALUE(Data[Item])),
    [rank1]
)
return rank_out

两种方案的计算步骤基本上一致,结果略有差异,但也只是在并列排名里顺序不太一样。

大家可以对比两种方案,写法上有什么优劣。并且在以后遇到数据表无法进行更改或者不想进行数据表的修改时,我们就可以通过写一个度量值的方式来避免。

而这,会让你对DAX的理解更加深刻!

我是学谦,这里是PowerBI学前班

如果觉得有用, 请对本文点赞、在看、转发三连,谢谢!

0 人点赞