PowerBI-Rankx用法
Cemon_Liu Lv5

PowerBI Rankx用法实践

本周在PowerBI学习群遇到一个关于排名的问题,用了很久时间去思考,结果还是没完成。后面看到其他人写的公式用法。故学习记录一下。

问题描述

模拟的数据如下,公司在不同的时期有不同的消费。要获取在当前筛选时期下的排名以及当前时期上一个时期的排名。
image

结果应该是下图
当我选择第四期,显示第四期排名和第三期排名。
image

实现过程

Powerbi排名函数使用的Rankx,具体用法如下:
PowerBI 中的 RANKX 函数是一个迭代函数,用于计算某列数据在分组内的排名。它的基本语法如下:

1
2
3
4
5
6
7
RANKX(
<表>,
<表达式>,
<值>,
<排序方式>,
<排序上下文>
)

各参数的含义:

<表>:要计算排名的表或表达式
<表达式>:要计算排名的列
<值>:指定用于排名的值
<排序方式>:排序方式,可选desc降序或asc升序,默认为asc
<排序上下文>:指定分组依据,可使用ALLSELECTED()表示无分组

错误方式

实现思路为获取当前的期数,然后构造一个当前期数-1的table用于rankx运算。在rankx里面,第一个参数放的filtertable, 第二个参数计算当前上下文金额的总和。 这个也是问了各个AI工具之后都建议的用法。实际产生的结果却是不符合预期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
环比-2 = 
VAR currentPeriod = SELECTEDVALUE(Demo[Period]) -- 获取当前期数
var targetPeriod=currentPeriod-1

var filtertable=FILTER(
ALL(Demo),
Demo[Period] = targetPeriod
) -- 过滤出当前期数的数据
var result= RANKX(
filtertable,
CALCULATE(sum(Demo[Cost])), -- 在当前上下文中计算金额的总和
,DESC
)
return result

正确方式

这里获取期数的方式是一样的,唯一调整的是 rankx函数的第一个参数调整为all(Demo[company]),将筛选条件放到后面计算cost的函数里面去。

1
2
3
4
5
6
7
8
9
10
环比-demon = 
VAR currentPeriod = SELECTEDVALUE(Demo[Period]) -- 获取当前期数
var targetPeriod=currentPeriod-1
var result= RANKX(
ALL(Demo[company]),
CALCULATE(sum(Demo[Cost]),Demo[Period]=targetPeriod), -- 在当前上下文中计算金额的总和
,DESC

)
return result

放一张两个DAX运行差异结果。可以看到第三期A1本来是第六名,在错误的方式里面却是第一名。

image

差异反思

在使用rankx的时候应该要注意第一个参数,一般是要排名的维度,当我们要做一些分组排名时,可能要使用all,allexcept去做一些资料筛选去重。当我们放入了filtertable时,此时的数据变得复杂了,进而导致最终的结果与预期不一致。有人说这个会将他们上一期的cost拿到这一期来进行排名。但是实际结果看起来也不像。

对于DAX上下文的理解一直是学习Powerbi中的弱势,学会了就是实现各种复杂功能的利器,不然就要靠前期的数据调整来避免这种问题。后面要多实践这种逻辑。

如果你也有遇到类似的问题,欢迎留言关注。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量