使用RANKX计算层级排名

生活中我们总是免不了排名,学校考试有排名,考研考公看的还是排名,就连某些大厂招人都是根据后选人的得分在系统中进行第123顺位侯选人的排名。

工作中也一样,销量排名第一的商品,业绩排名第一的业务员,增长率排名第一的品类。。。

接下来就来看看在PowerBI中怎么实现排名,我们需要用到一个函数RANKX,基础语法如下:

RANKX( <表>, <表达式>, [<值>], [<排序>], [<平局规则>])

普通排名

比如我们要对产品表中的产品名称进行排序,DAX新手可能会直接写出下面的度量

Rankx Wrong = 
RANKX( 'Product', [Sales Amount])

会发现,所有的的商品的排名都是1,这是因为在每一行上计算当前商品的排名时表达式中Product表中就只有当前商品名,自己和自己比较,肯定都是第一名了。

所以,如果我们想要得到正确的排名,就要让当前的商品名和所有的商品名进行比较,所以我们可以写成下面这样,使用ALL函数来强制转换,这样在每一行上比较时都是和所有的商品名来比较,

Rankx ProductName All = 
RANKX( ALL( 'Product'[Product Name] ), [Sales Amount])

但是,如果我们只想比较选定商品的排名呢?下图可以看出虽然我们只选定了五个商品名,可以在计算排名时还是和所有商品名比较的。

所以我们应该缩减范围为当前选定的范围,可以使用ALL家族的另一个函数ALLSELECTED

Rankx ProductName Allselected = 
RANKX( ALLSELECTED( 'Product'[Product Name] ), [Sales Amount])

可以看到商品在进行排名时就是按所选的范围内的商品进行排名了,这不禁想到了双十一抑或618大促时各家手机厂商都是销量冠军了,这其实就是各手机厂商的捷报里加了足够多的定语,即限定条件,就比如上图中的M300 Green,虽然在所有商品的排名中是第935位,但在选定的商品中排第1位。

层级排名

这其实又引到了一个新的排名方式—组内排名,比如每个商品都是归属于一个一级类别和二级类别,电商通常会对按类别进行排名查看最畅销的类别,然后还会对类别中的商品进行排名,来查看该类别下最畅销的商品。

先看效果,从下图中可以看出来在计算排名时不同是有层级的概念的,

  • • 即在Category级别,是和所有的Category进行比较从而计算排名

  • • 在Subcategory级别,是和当前Category下的所有Subcategory的商品进行比较从而计算排名

  • • 在Prodruct Name级别,是和当前Category下的当前Subcategory下的所有商品进行比较从而计算排名

总而言之,就是不同层级计算排名时,比较的范围是不一样的,这就要求在不同层级时我们构造不同的表,就像下面这样,这里要注意使用SWITCH进行判断时必须先写Prdocut Name层级,因为无论是在哪个层级ISINSCOPE ( ‘Product'[Category] )都是true,感兴趣的可以尝试下,后面会专门再来介绍下ISINSCOPE、ISFILTERED这类函数。

Rank = 
SWITCH(
    TRUE(),
    ISINSCOPE ( 'Product'[Product Name] ),
    RANKX (
        CALCULATETABLE ( 
            ALL ( 'Product'[Product Name] ),
            VALUES (  'Product'[Category] ),
            VALUES ( 'Product'[Subcategory] )
        ),
        [Sales Amount]
    ),
    ISINSCOPE( 'Product'[Subcategory] ),
    RANKX (
        CALCULATETABLE(
            ALL ( 'Product'[Subcategory] ),
            VALUES( 'Product'[category] )
        ),
        [Sales Amount]
    ),

    ISINSCOPE ( 'Product'[Category] ),
    RANKX ( 
        ALL ( 'Product'[category] ),
        [Sales Amount]
    )

)

当在Product Name层级,我们又使用了一个重量级的函数CALCULATETABLE,我们先使用了ALL ( ‘Product'[Product Name] )来生成了所有商品名的表,但是这个范围太大了,所以接下来又使用VALUES ( ‘Product'[Category] )来限定为只是当前Catgeory下的商品名,但是范围还是太大了,所以进一步的使用VALUES ( ‘Product'[Subcategory] )来限定为当前Catgeory下的当前SubCategory下的所有商品。当然,这两个VALUES表达式也可以使用ALLSELECTED( ‘Product'[Product Name] )来代替。(这其实是涉及到DAX里重要的一个概念上下文及上下文转换,无论是DAX新手还是老手都会在这上面踩坑的,所以,DAX新手不要怕犯错,多写,多想就好)

有了层级的排名,相应的其实还有有层次占比,进而会有动态的TopN和其他,比如Category层级显示的是top3的Category和其他,然后展开top的Category显示的又是该Categry下的Top3的商品和其他以及他们的占比。


点击下方阅读原文,发现不一样的世界

本篇文章来源于微信公众号: PowerBI木小桼

类似文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注