Power Query系列 - 排序Ranking
Power Query系列 - 排序Ranking
难度: ★★☆☆☆(1星)
适用范围: ★★★☆☆(3星)
概况:
在数据分析中,我们常常需要对数据进行排序,同时我们想知道某个项目或者产品的排名,以方便查阅或对排名靠前的进行特别处理。
应用场景:
以下是几个应用场景:
对前五名销售进行奖励
对前五名的销售求和
对末3位进行淘汰
....
然鹅,排名有多种,下面是小抄:
- 顺序排序(1234排序)-这种排序方法对数据的每一行使用序号,而不关心平局/并列。
- 标准比赛排名(1224排序)-也称为跳过排名的一种形式,该方法为平局分配相同的排名,并且跳過下一個排名值。 在这种情况下,我们的值分别变为1,2,2,4,5 。
- 修改后的比赛排名(1334排序)-与标准比赛排名方法类似,但是跳过的值位于平局之前 。 在这种情况下,我们将得到1,3,3,4,5
- 密集排名(1223排序)-在这种排名方法中,平局/并列(一样的值)具有相同的排名,但不会跳过下一个值。 在这种情况下,我们有1,2,2,3,4,5。
- 分数排名(1/2.5/2.5/4排序)-这个排名我还没有见过或用过。
那么,如何在Power Query中进行构建,以便可以在Excel和Power BI和中显示它们呢?
最终Excel效果显示如下:

欢迎转载,请保留原文链接和作者信息。O(∩_∩)O谢谢。
Power Query系列 - 排序Ranking
作者:马丁叔叔
链接:http://www.cnblogs.com/lizardbi/p/PowerQuery-POWERBI-Ranking.html
数据模型:

要点:
- 何时加入索引Index
- 用什么分组Grouping方法
一起来实现各种排名方法吧!
如果下载附件,您将看到它具有上面显示的完整的Excel表格。 为了简化说明,以下步骤只选取了两列作为SalesData表:
在Excel表格中选择一个单元格->数据->从表格/范围
选择项目和销售列->右键单击->删除其他列
仅作为连接加载
这给了我一个简单的表,其中仅包含产品名称和值,如下所示:
| 產品 | 销售 |
|---|---|
| Comvita 康维他 | 500 |
| Avitago儿童蜂胶 | 400 |
| 同仁堂蜂蜜 | 400 |
| Aurinda 澳琳达 | 200 |
| By-Health 汤臣倍健 | 100 |
如您所见,销售列已经按降序排序,这是我们对并列排名的关键所在。
对于每种排名方法-我们实际上将通过以下方式开始每个新查询(Query):
引用SalesData查询 (Reference)
重命名新查询以表示所展示的排名方法
这意味着我将基于上面的视图每次给出步骤,因为这是我们从引用步骤中应该得到的。
排名方法1:顺序排名(1234排序) (Ordinal Rank)
这种排名方法非常容易创建:
按降序对“销售”列进行排序
按升序对“项目”列进行排序(按字母顺序对关系进行排名)
转到添加列->索引列->从1开始
重命名索引列为排名
根据需要重新排列列
对,就酱。 它只是向您的数据排序方式添加了一个行号,如下所示:
let
Source = SalesData,
#"Removed Columns" = Table.RemoveColumns(Source,{"顺序排名", "标准竞赛排名", "修改竞争排名", "密集排名", "分数排名"}),
#"Added Index" = Table.AddIndexColumn(#"Removed Columns", "Index", 1, 1)
in
#"Added Index"
结果如下:

Avitago儿童蜂胶和同仁堂蜂蜜在列表中排名第2和第3,但销售均为400,而默认按照字母顺序,分别获得第2和第3的排名,而Aurinda 澳琳达按销售排第4。
当然,可以加入相同销售额的时候按照名字倒叙排名,同仁堂排第2,Avitago排第3。
排名方法2:标准比赛排名 (1224 排序)(Standard Competition Rank)
这种排名方法涉及使用一些分组以使值正确显示:
按降序对“销售”列进行排序
添加索引列,从1开始
转到转换->组
按销售列分组
创建以下列:
使用“索引”列上的“最小”运算的排名
使用“所有行”操作的数据
展开项目列
根据需要重新排列列
let
Source = SalesData,
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"销售"}, {{"Rank", each List.Min([Index]), type number}, {"Data", each _, type table}}),
#"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
#"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "销售", "Rank"})
in
#"Reordered Columns"
结果如下:

结果正确地表明,Avitago儿童蜂胶和同仁堂蜂蜜在列表中排名第2和第3,但销售均为400,故此,分别获得第2的排名,而Aurinda 澳琳达(在列表中排名第4)的排名为4,因为并列第二名,故没有第三名。
排名方法3:修改后的比赛排名 (1334排序)(Modified Competition Rank)
要按照修改后的比赛排名方法创建排名,我们需要:
按降序对“销售”列进行排序
添加索引列,从1开始
转到转换->组
按销售列分组
创建以下列:
使用“索引”列上的“最大”运算的排名
使用“所有行”操作的数据
展开项目列
根据需要重新排列列
let
Source = SalesData,
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"销售"}, {{"Rank", each List.Max([Index]), type number}, {"Data", each _, type table}}),
#"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
#"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "销售", "Rank"})
in
#"Reordered Columns"
此排名方法与标准竞争排名之间的唯一区别是,我们使用“索引”列的“最大值”而不是先前方法中使用的“最小值”来创建“排名”列。

结果表明,Avitago儿童蜂胶和同仁堂蜂蜜在列表中排名第2和第3,但销售均为400,故此,分别获得第3的排名,而Aurinda 澳琳达(在列表中排名第4)的排名为4。因为并列第三名,故没有第二名。
排名方法4:密集排名(1223排序)(Dense Rank)
密集排名方法要求更改标准竞争排名方法中步骤的顺序。 也就是说,Group By命令必须在添加Index列之前出现:
按降序对“销售”列进行排序
转到转换->组
按销售列分组
创建以下列:
使用“所有行”操作的数据
添加索引列,从1开始
展开项目列
根据需要重新排列列
let
Source = SalesData,
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"销售"}, {{"Data", each _, type table}}),
#"Added Index1" = Table.AddIndexColumn(#"Grouped Rows", "Index", 1, 1),
#"Expanded Data" = Table.ExpandTableColumn(#"Added Index1", "Data", {"產品"}, {"產品"}),
#"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "销售", "Index"}),
#"Renamed Columns" = Table.RenameColumns(#"Reordered Columns",{{"Index", "Rank"}})
in
#"Renamed Columns"
此方法将产生以下结果:

结果正确地表明,Avitago儿童蜂胶和同仁堂蜂蜜在列表中排名第2和第3,但销售均为400,
故此,分别获得第3的排名,而Aurinda 澳琳达(在列表中排名第4)的排名为3。
这里与竞赛排名和修改后竞赛排名不同之处在于,
这里不会跳过任何一位的排名数字。
排名方法5:分数排名 (Fractional Rank)
就像我一开始提到的那样,我发现这是最奇怪的排名方法之一。
但是,像上面其他的一样,创建它非常容易。
按降序对“销售”列进行排序
添加索引列,从1开始
转到转换->组
按销售列分组
创建以下列:
使用“索引”列上的“平均”运算的排名
使用“所有行”操作的数据
展开项目列
根据需要重新排列列
let
Source = SalesData,
#"Added Index" = Table.AddIndexColumn(Source, "Index", 1, 1),
#"Grouped Rows" = Table.Group(#"Added Index", {"销售"}, {{"Rank", each List.Average([Index]), type number}, {"Data", each _, type table}}),
#"Expanded Data" = Table.ExpandTableColumn(#"Grouped Rows", "Data", {"產品"}, {"產品"}),
#"Reordered Columns" = Table.ReorderColumns(#"Expanded Data",{"產品", "销售", "Rank"})
in
#"Reordered Columns"
结果如下:

这个,你在哪里用到过……?
总结
实际上,可以看到,仅对应用分组Grouping方法时所选择的步骤顺序,并且/或者,汇总时进行一些小的修改即可轻松地更改排名方法:
譬如,有的先加入索引列,有的后加;有的用最大值,有的用最小值,有的用平均值。
但是,
如果你熟悉了这些,任何排序方法都难不倒你了!!
当然我们可以使用Excel公式创建每种排名方法,
但,文中的方法用Power Query实现,
酱,我们可以将结果直接加载到Power Pivot或者Power BI中。
(完)
Power Query系列 - 排序Ranking的更多相关文章
- 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据
我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...
- 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化
在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...
- Power BI for Office 365(二)Power Query
在上一篇中我们看到了Power BI在移动端的支持,从这一篇起降依次介绍Power BI中的各个功能组件,此篇讲通过一个故事来介绍如何在Power Query中获取并且组织数据. 在这个系列中,我们将 ...
- SQL Server 2014 BI新特性(三)Power Query和Power Map功能预览
Power Query和Power Map是微软前不久在WPC上发布的Power BI中新的针对Excel的功能.借助这两样功能,自助式BI将更方便你发现和处理数据并且丰富数据的可视化功能. Powe ...
- 一张图看懂微软Power BI系列组件
一.Power BI简介 Power BI是微软最新的商业智能(BI)概念,它包含了一系列的组件和工具.话不多说,直接上图吧: Power BI的核心理念就是让我们用户不需要强大的技术背景,只需要掌握 ...
- 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库
说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...
- 一起学微软Power BI系列-使用技巧(2)连接Excel数据源错误解决方法
上一篇文章一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库中,我们介绍了Power BI Desktop中连接Oracle和Mysql的方法,其实说到底还是驱动的问题, ...
- 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍
我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...
随机推荐
- VirtualBox NAT Network配置
VirtualBox NAT Network配置(OSX上的) VirtualBox的5种连接方式 NAT :虚拟机之间不能互通 NAT网络 :本文对象 桥接 :一般情况下虚拟机无法设置静态IP,并且 ...
- 搭建ASP.NET Core WebApi项目
步骤 从“文件”菜单中选择“新建”>“项目” . 选择“ASP.NET Core Web 应用程序”模板,再单击“下一步” . 将项目命名为 NetCoreWebApi,然后单击“创建” . 选 ...
- python的多线程和多进程(一)
在进入主题之前,我们先学习一下并发和并行的概念: --并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但任一时刻点上只有一个程序在处理 ...
- 选择器, ,>,+,~
一.后代选择器 选取指定元素的后代元素 与子元素选择器相比,后代选择器选取的不一定是直接后代(儿子),而是作用于所有后代元素(儿子.孙子.重孙…)都可以. 二.(>)子元素选择器 选取某个元素的 ...
- Unity5-ABSystem(二):AssetBundle导出
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lodypig/article/detai ...
- 【 格式化时间(SimpleDateFormat)用法】
将特定字符串转换成Date格式 可以通过 new 一个 SimpleDateFormat 对象,通过对象调用parse方法实现 示例代码: String time = "2019-11-09 ...
- CSPS模拟 52
我貌似曾经说过我是个只会做水题的巨型辣鸡.. 这次证明我水题都不会做.. T1 平均数 区间数$n^2$ 枚举是不可能了 可是好像没有无用的计算量.. 刚想到这里,此时开考15min 看见天皇比手势说 ...
- SpringBoot整合Swagger实战
源码地址:https://github.com/laolunsi/spring-boot-examples 目前SpringBoot常被用于开发Java Web应用,特别是前后端分离项目.为方便前后端 ...
- COO 与 CSR 稀疏矩阵存取格式;
稀疏矩阵是指矩阵中元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上是稀疏矩阵,很多稀疏度在90%甚至99%以上:因此我们需要有高效的稀疏矩阵存储格式. 本文参考了 https://www.cn ...
- MapReduce 人个理解
1.MapReduce 理解 拆分成 map 过程与 reduce 过程: map 可以理解为sql 中的 group by 操作, reduce相当于group by 后的聚合计算 : 一个map ...