使用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木小桼