DAX分享4:PowerBI用DAX计算排序(Rank)

浏览: 2487

最近比较忙。之前想着要写排序Rank问题的,然后就今天吧。

数据源是之前我们研究过的Product产品表。

图4.0.png

要做的稍微好玩一点,所以需求就是,在选择Brand,Color的情况下,table(包括Brand,Color,Product Name,Unit Price)的数据表能够显示正确的排序(Rank)值。

图4.3.png

怎么做呢?第一反应肯定是用DAX里面的排序函数RANKX。

RANKX的语法如下:

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

首先我们要在什么table(表)里面去逐条排序呢?对,应该是Product表。但是是全部的数据都要考虑吗?当然不是,如果全部(ALL)

数据都要考虑的话,那slice和column这些Filter Context就会被忽略掉。所以我们要用ALLSELECTED().

然后考虑表达式,一个针对filter context有效的函数,所以CALCULATE,至于sum,max还是min,其实都可以的。

所以结果就很简单啦:

rank unit price = RANKX(ALLSELECTED('Product'),CALCULATE(SUM('Product'[Unit Price])),,,Dense)

(为什么是Dense呢?你写Skip也可以啊。Dense是如果相同的14个第一名,第15个是第二名;Skip是14个第一名,第15个是第十五名。)

图4.5.png

选择了Brand(品牌)Contoso,Color(颜色)Brown。

图4.6.png

就是这么easy!好像DAX也不是很难的样子。

哈哈,然后就是放飞自我的其他排序方法时间啦!对于上面这个需求,我的放飞自我的方法不算完美,有点后悔是不是该放飞自我了...

图4.2.png

有一种装13的函数EARLIER()。这是一个神奇的函数,他可以access to outer filter context。写出来的Calculate Column如下:

rank earlier = COUNTROWS(

FILTER(ALL('Product'[Unit Price]),'Product'[Unit Price]> EARLIER('Product'[Unit Price])

) )+1

当前的unit price和之前的unit price比较,这个函数的名字起得还不错嘞。不过他的performance不好,所以一般用变量把他替换掉。

RANK var =

VAR price  = MIN('Product'[Unit Price])

RETURN

COUNTROWS(

FILTER(ALLSELECTED('Product'),'Product'[Unit Price] > price))+1

图4.7.png

注意我用的ALL()或者ALLSELECTED(),现在在报表中的显示是不一样的。

然后选择Brand(品牌)Contoso,Color(颜色)Brown。注意结果哦

图4.8.png

是不是更好玩了呢。

图4.1.png

欢迎关注DAX Share。简单的好玩的应有尽有!

banmi.jpg

推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册