(三) 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进行转换计算。
数量排名:=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'[成绩])
如果觉得不错,请点赞转发下。
请点个赞,转发分享给更多的人。