PowerBI 排序RANKX 技巧(引入次级排序列)

时间:2024-04-01 20:38:22

前言:

大家好,我是小小大世界,最近刚好在使用RANKX这个函数做一张服装销量Top10的的商品报表,想必关于RANKX这个函数,大家百度能出来一大堆的使用方式,下面我就加入我自己的总结和一些常见问题解决,相信对大家会很有帮助。

正文:

先提出今天要解决的几个问题(重点放在第二个问题上):

问题一:RANKX函数的语法、使用方式、使用技巧(网上很多文章都有具体使用);

问题二:如何解决当首要排序列遇到相同值时,依次要排序列进行排序?(例如,当依销量排序时,遇到相同销量,而你想在销量相同时依营业额进行排序,怎么做?)

那么带着如上两个问题我们开始今天的介绍:

首先来看一下如下报表:
PowerBI 排序RANKX 技巧(引入次级排序列)

此表示用PowerBI制作的,展示了某季节销量排行前十的服装款号和图片,该表就是使用了RANKX这个函数结合图片的可视化进行展示。

问题一:

首先RANKX的语法如下:

RANKX(

, [, [, [, ]]])

RANKX(<表>,<表达式>[,<值>[,<排序方式>[,<排序枚举>]]])

RANKX具体使用方式网上其他文章有介绍,我总结如下:

常用的最简单的写法如下:

RANKX(ALL/ALLSELECTED(‘商品维度表’[图片URL]),‘商品维度表’[销售量],desc)

重点我标出来了,新手使用的时候经常会碰到为什么排名出来全是1,或者乱七八糟的。

原因主要出现在我如上黑体斜体体现的部分,简单来说就是第一<表>没有使用ALL或者ALLSELECTED函数去排除行上下文和筛选上下文,导致排序的收到上下文的影响。第二表达式没有使用提前聚合好的度量值,而直接使用类似SUM(xxx)这样的聚合函数。第二个不过多解释原理,只要记住提前创建度量值后直接使用即可。

主要看下ALL和ALL的应用场景,ALL应用于对整体进行排序,而ALLSELECTED用于某个类别进行排序,这里引用网络上的一个图片进行解释:

整体绝对排名 = RANKX(ALL(‘产品’),[销售额])

整体相对排名 = RANKX(ALLSELECTED(‘产品’),[销售额])
PowerBI 排序RANKX 技巧(引入次级排序列)

上图中的整体绝对排名(ALL)就是产品在所有产品民称中的排名,而整体相对排名(ALLSELECTED)就是通过你筛选的这些产品名称中的排名。通过这个例子各位也可以再次理解一下ALL和ALLSELECTED的用法,一个是总体,一个是你选择的总体。

这边我要拓展一下CROSSJOIN的用法,场景如下:
PowerBI 排序RANKX 技巧(引入次级排序列)

排名 = RANKX(CROSSJOIN(ALL(‘款号销量排行’[商品款号]),ALL(‘款号销量排行’[图片])),‘款号销量排行’[总排行升序过度],DESC)

当在表中要同时显示图片和款号时候,如果直接使用原公式:RANKX(CROSSJOIN(ALL(‘款号销量排行’[商品款号])),‘款号销量排行’[总排行升序过度],DESC) 你会发现排名会出错,这时就要用到CROSSJOIN这个函数,相当于增加了一个图片的维度。

RANX函数使用方式就介绍到这里,RANKX这个函数在PowerBI星球的一篇文章中介绍的很清楚,下面我就将对这个函数的使用进行拓展,就是问题二中所提到的,当主要排序列相同时,使用次级排序列进行排序的方法,避免出现重复排名的问题。

问题二:

PowerBI 排序RANKX 技巧(引入次级排序列)
图中红色框部分,当遇到销量相同时,排名会重,但通常在我国是不太接受这种排名方式,所以大多数需求引入次级排序列,在这里我引入了总营业额。在销售量相同的时候依总营业额进行次级排序。

下面先说下思路:

要引入次级排序,那么久要创建一个表达式,该表达式优先根据销量排名,再加上次级排名的值,换成数字进行表达就是1+0.X,2+0.X,3+0.X,类似这样的组合,其中小数位为次级排名,这样,创建了这个过渡值,再依这个过渡值进行排序,就不会出现排名重复的问题。

那么如何创建过度值呢?请参考如下公式:

排行款号过度 = RANKX(ALL(‘商品维度表’[商品款号]),‘商品维度表’[销售量],desc)+RANKX(ALL(‘商品维度表’[商品款号]),‘商品维度表’[营业额(聚合)],desc)/(CALCULATE(DISTINCTCOUNT(‘商品维度表’[商品款号]),ALL(‘商品维度表’[商品款号]))+1)

加粗的为第一部分,斜体加粗为第二部分,第一部分整数部分,就是销量排名部分,第二部分就是以小数方式体现营业额的排序,仔细观察一下公式各位应该就能明白如何以小数的形式去表示次级排序了,这里就提示一下为什么要+1,因为例如有100个产品,前99都不收影响,但最后一个产品相除就会变成1,那么肯定不符合小数的要求,所以+1就是因为这个,当然你要+2 +3 +4…都可以。

最后排名的表达式用上这个过渡值如下:

次级排行 = RANKX(ALL(‘商品维度表’[商品.商品款号]),‘商品维度表’[排行款号过度],asc)

如上就完成了问题二的需求。

结语:

其实关于RANKX网上有很多很好的文章,但是很多具体的应用是需要自己点点滴滴的积累,不知道今天对RANKX次级排序的补充有没有帮助到你们,希望大家可以多和我交流。