一篇文章让你完全掌握Power Pivot中如何进行排名

2020-03-24 15:40:09 浏览数 (1)

(三) Rank.EQ

1. 语法

代码语言:javascript复制
Rank.EQ ( <Value>, <ColumnName> [, <Order>] )

位置

参数

描述

参数1

Value

任何返回标量的表达式

参数2

ColumnName

排名依据的列数据

可选参数3

Order

0代表降序,1代表升序,默认降序

2. 返回

数值——在列中所处的排名位置

3. 注意事项

  • 在添加列中使用,但是不能和虚拟创建的列使用(例如用AddColumns,Summarize等函数创建的列)。
  • 如果数值不在查找的里中,则会返回空值。
  • 如果存在排名一样,下一个排名将会跳过重复值。例如第3名有3位,则下个排名直接是6。

4. 作用

返回值在数据列中的排名。

5. 案例

代码语言:javascript复制
数量降序=RANK.EQ('表5'[数量],'表5'[数量])
数量升序=RANK.EQ('表5'[数量],'表5'[数量],1)

解释: 因为第3参数默认为0(降序),数量3为最大数值,同时有3个,都是排第1位,而后的2跳过同等排名位置,因为有3个,把正常的1-3名都占据了,所以数量2的排名为4。

(四) RankX

1. 语法

代码语言:javascript复制
RankX ( <Table>, <Expression> [, <Value>] [, <Order>] [, <Ties>] )

位置

参数

描述

第1参数

Table

需要比对的表

第2参数

Expression

针对每一行运算的表达式

可选第3参数

Value

返回查找标量值的表达式,缺省则默认和第2参数一样。

可选第4参数

Order

降序0或升序1排名。默认0

可选第5参数

Ties

碰到同排名,之后的排名是顺延排序Dense,还是跳过排序Skip。默认Skip

2. 返回

标量——数值

3. 注意事项

  • 如果表达式为空,则代表0
  • 可选参数如果想跳过,直接用,保留其位置
  • 如果第3参数的值不在第2参数里,则会将参数3的值添加到参数2中进行重新计算

4. 作用

根据排名规则列出排名的序号

5. 案例

代码语言:javascript复制
RankX跳过降序=RANKX('表5','表5'[单价])
RankX连续降序=RANKX('表5','表5'[单价],,,Dense)
RankX连续升序=RANKX('表5','表5'[单价],,1,Dense)
RankX跳过升序=RANKX('表5','表5'[单价],,1)

使用在度量值里: 例如我们要求每天数量合计的排名。要求这个,肯定要涉及两个指标,一个是求和(Sum),一个是排名(RankX)。

代码语言:javascript复制
数量合计:=Sum('表5'[数量])
数量排名:=RankX(All('表5'[时间]),[数量合计]))

这里涉及到一个上下文的概念,如果想写在一个公式里面,不能直接这样写 数量排名:=RankX(All('表5'[时间]),Sum('表5'[数量]))这样写就会出错,因为Sum直接这样写不存在上下文的关系。如果要写在一个公式里,必须把Sum再转换成上下文计算。也就是添加calculate进行转换计算。

代码语言:javascript复制
数量排名:=RankX(All('表5'[时间]),Calculate(Sum('表5'[数量])))

我们看到在透视表里面的总计这数量排名为1,实际上这个数字是没有任何意义的,我们想把他变成空。这里就会涉及到是否被筛选的问题。因为之前的数据都是被日期给筛选,而总计这里是未被筛选,通过IsFiltered就可以实现这个功能。

代码语言:javascript复制
数量排名_去合计:=If(IsFiltered('表5'[时间]),RankX(All('表5'[时间]),Calculate(Sum('表5'[数量]))),Blank())

另外对于排名我们用另外一个透视表来解释下,同时在重新理解下All函数的含义。 我们知道之前的函数中我们忽略了时间维度。我们来看下这两个公式的差异。

代码语言:javascript复制
数量排名:=RankX(All('表5'[时间]),Calculate(Sum('表5'[数量])))
数量排名_ALL:=RankX(All('表5'),Calculate(Sum('表5'[数量])))

一个是只忽略了时间维度,一个是忽略了全部维度。我们把两个度量都放在透视表里面看下。同时叠加了时间和价格2个维度

解释: 首先我们看数量排名这个度量,因为只忽略了1个时间维度,所以结果是只有价格维度起作用。所以只针对价格维度进行比较排名。

其次我们看数量排名_All这个度量,因为忽略了全部维度,所以相当于根据数量进行全局排名。

如果我们添加上时间汇总也会同步进行比较。

除此之外我们的排名还有可能在不同层级里进行排名。

一种要求是我们要求出学生在各个维度里面的排名。例如要求求出学生在班级,年级,学校中的排名;另外一种是各个维度横向比较。 我们先来看学生各自的成绩在各个维度里面的排名。

代码语言:javascript复制
班级排名:=RankX(All('表1'[班级]),Calculate(sum('表1'[成绩])))
年级排名:=RankX(All('表1'[班级],'表1'[年级]),Calculate(sum('表1'[成绩])))
学校排名:=RankX(All('表1'[班级],'表1'[年级],'表1'[学校]),Calculate(sum('表1'[成绩])))

这个相对好理解,就是维度忽略的问题。 如果我们要对各个学校,各个年级,各个班级之间进行比的话。

那如何实现这种效果呢?要对各个维度进行排名。这是就需要我们添加上一个判断函数HasoneFilter。 最终实现的效果如下:

代码语言:javascript复制
总成绩:=Sum([成绩])
完整排名:=Switch(TRUE(),
HasoneFilter([姓名]),Rankx(all('表1'[姓名]),[总成绩]),
HasoneFilter([班级]),Rankx(all('表1'[班级]),[总成绩]),
HasoneFilter([年级]),Rankx(all('表1'[年级]),[总成绩]),
HasoneFilter([学校]),Rankx(all('表1'[学校]),[总成绩])
                 )

还有一种情况是我们需要在添加列里面进行维度里的排名。

代码语言:javascript复制
RankX(Filter('表1','表1'[学校]=Earlier([学校])),'表1'[成绩])

如果是需要在2级维度里面排名,则只需要添加2个条件即可。

代码语言:javascript复制
学校年级维度=RankX(Filter('表1','表1'[学校]=Earlier([学校])&&
                         '表1'[年级]=Earlier([年级])),'表1'[成绩])

如果觉得不错,请点赞转发下。

请点个赞,转发分享给更多的人。

0 人点赞