大家好,我是学谦,这里是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学前班。
如果觉得有用, 请对本文点赞、在看、转发三连,谢谢!