六大业务场景帮你理解Power BI RANKX排名函数

文摘   2024-09-08 16:03   广东  

    小伙伴们,大家好~前天学习交流群中有小伙伴问RANKX排名函数的用法,正好小编之前有做过非常详细的整理和总结,今天将小编总结的内容与大家进行分享,这篇文章对您有帮助的话,还请帮忙转发或分享,感恩的心~

RANKX函数语法规则介绍:

RANKX函数是计算排名的专用函数,根据你的计算逻辑,返回当前成员在整个列表中的排名,是一个典型的迭代函数,计算过程值得着重理解。

RANKX(<table>, <expression>, [ <value> ], [ <order> ], [ <ties> ])
  • 参数1:表或者返回表的表表达式

  • 参数2:基于参数1表计算的表达式

  • 参数3:可选,需要返回排名的DAX表达式,如果这个值省略则默认是参数2的表达式

  • 参数4:排名的依据,0或者False代表降序;1或者True代表升序

  • 参数5:处理相同排名时的依据,skip代表稀疏排名,下一个排名等于之前所有排名的数量+1;dense代表稠密排名,只累加排序不考虑数量,默认是skip


应用场景1:计算产品子类别的排名
下面两个表达式返回的结果是一样的,差异在是否有第3参数,上面语法规则中介绍到如果参数3这个值省略则默认是参数2的表达式,如果是对参数2的表达式进行排序,两者是等价的,通常为了方便我们会选择_rank_1的写法。下面我们介绍下整个计算流程:
_rank_0 = RANKX(ALL('产品'[子类别]),[销售总额],[销售总额])_rank_1 = RANKX(ALL('产品'[子类别]),[销售总额])
  1. 通常我们会使用ALL或者ALLSELECTED函数,目的是为了取消外部子类别的筛选,本案例ALL返回的是一个只包含产品子类别的单列的表(ALL返回的结果是表)
  2. RANKX函数是迭代函数,参数1的里面的值都会参与迭代,每一次迭代会生成一个子类别对应销售额的值,参数1和参数2的计算生成了一张看不见的参考表,且这个参考表只包括销售额的值(也就是下图中的第1步)
  3. 第2步生成的结果(此处以复印机为例,返回的结是518117.43),这个计算结果是迭代之外的原始计算上下文,本例中就是复印机,那么返回复印机的值再到参考表中去匹配找到其位置并返回所在位置的序号,也就是我们所说的排名。


 应用场景2:如何避免总计排名是1

下图中我们看到总计行排序是1,是因为步骤2计算的值是所有子类别的总销售额,它总大于单个子类比的值,因此,在总计行显示的值总是1,这并非bug或者缺陷。如何去避免这个1出现了,我们可以通过IF+HASONEVALUE的经典搭配来实现。

IF (    HASONEVALUE ( '产品'[子类别] ),    RANKX (        ALL ( '产品'[子类别] ),        [销售总额]    ),    BLANK ())

应用场景3:简单的相对排名
    很多情况下,我们需要看到的是相对排名,例如我们希望是子类别的排名依据筛选后的多个子类别进行排序(例如,_rank_03返回的排序),这个实现起来不复杂,可以将ALL函数改成ALLSELECTED函数即可,ALL函数是返回的是全部子类别的元素,不管是否在视觉对象中可见,而ALLSELECTED返回的仅是视觉对象可见的这些子类别元素,因此,两者有略微差异。
总结:
  • ALLSELECTED:相对排名,根据筛选的条件再进行排名
  • ALL:绝对排名,依然是依照原来的排名顺序展示
  • 两者计算无对错之分,只有根据自己实际业务需求来选择。
IF (    HASONEVALUE ( '产品'[子类别] ),    RANKX (        ALLSELECTED ( '产品'[子类别] ),        [销售总额]    ),    BLANK ())


应用场景4:类别内进行分组排名
    见下图中,维度字段有类别和子类别,需要先在类别维度进行排序也就是基于类别的三个元素在总计处进行排序(见红色框),然后再实现在每个大类里面进行排序(见蓝色框),具体实现表达式如下,这里面使用的技巧主要是IF+HASONEVALUE对不同层级进行判断,分别应用不同的排序规则即可。
_rank_4 = SWITCH (    TRUE (),    HASONEVALUE ( '产品'[子类别] ),        RANKX (            ALLSELECTED ( '产品'[子类别] ),            [销售总额]        ),    HASONEVALUE ( '产品'[类别] ),        RANKX (            ALLSELECTED ( '产品'[类别] ),            [销售总额]        ),    BLANK ())


应用场景5:按照两个不同表的维度进行排序

    如下图中红色框所示,我们需要从两个不同的维度表中分别获取两个维度字段:类别和地区,用这两个字段计算的值实现排名,这个时候我们知道ALLSELECTED/ALL函数里面的参数是需要源自于1张表,因此,我们可以使用CROSSJOIN函数将两个字段进行组合,具体实现表达式如下:

_rank_5 = IF (    HASONEVALUE ( '产品'[类别] ),    RANKX (        CROSSJOIN (            ALLSELECTED ( '产品'[类别] ),            ALLSELECTED ( '地点'[地区] )        ),        [销售总额]    ),    BLANK ())

应用场景6:不同维度表中的维度字段进行分组排序
    下图中类别来自产品维度表,地区来自于地点维度表,需要计算组内的不同地区的销售额排名,同时需要在汇总层级计算类别的排序(具体实现效果见下图),参考表达式如下:
_rank_6 = SWITCH (    TRUE (),    HASONEVALUE ( '地点'[地区] ),        RANKX (            CROSSJOIN (                VALUES ( '产品'[类别] ),                ALLSELECTED ( '地点'[地区] )            ),            [销售总额]        ),    HASONEVALUE ( '产品'[类别] ),        RANKX (            ALLSELECTED ( '产品'[类别] ),            [销售总额]        ),    BLANK ())

ok,以上就是今天的分享~
  • 免费课程:Power BI免费课程更新至202405月
  • 免费课程绝大部分都是录制视频讲解,针对典型案例进行讲解,大家可以当做是一个字典,需要时候来找一找。免费课程不系统,有些基础内容小编默认你是知道,所以没有详细讲解,需要系统学习推荐看看小编的付费系统课程。
  • 付费课程:Power BI会员课程更新(202310)
  • 付费课程从零基础开始讲解,上手平滑,深入浅出,结合实际案例针对性强。具体可以参考介绍,课程内容持续更新,永久学习!(付费后,小编后面开发推出的所有课程和资源免费获取,无需再付费!)
  • 交流答疑群:本群为付费制(49/一位),仅作为学习交流Power BI/Excel/Tableau/SQL等数据分析、数据处理工具用,有问题可以描述清楚你的问题,附上案例数据求助。除此外,不讨论任何无关事情,违者立刻剔除。啊?不是吧?加群还要付费?嗯,是的,所以,加群后请谨言慎行!群里会不定期分享各类模板、学习书籍等资讯,确认以上条件都能接受再添加小编私信!





PowerBI Home
分享PowerBI、Tableau、Excel(函数公式、数据透视表、VBA)、Python、SQL等技巧。
 最新文章