前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一篇文章让你完全掌握Power Pivot中如何进行排名

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

作者头像
逍遥之
发布2020-03-24 15:40:09
4.2K0
发布2020-03-24 15:40:09
举报
文章被收录于专栏:数据技巧

(三) 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'[成绩])

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据技巧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (三) Rank.EQ
    • 1. 语法
      • 2. 返回
        • 3. 注意事项
          • 4. 作用
            • 5. 案例
            • (四) RankX
              • 1. 语法
                • 2. 返回
                  • 3. 注意事项
                    • 4. 作用
                      • 5. 案例
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档