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的更多相关文章

  1. 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据

    我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...

  2. 一起学微软Power BI系列-官方文档-入门指南(4)Power BI的可视化

    在前面的系列文章中,我们介绍了官方有关获取数据,以及建模的原始文档和基本介绍.今天继续给大家介绍官方文档中,有关可视化的内容.实际上获获取数据和建模更注重业务关系的处理,而可视化则关注对数据的解读.这 ...

  3. Power BI for Office 365(二)Power Query

    在上一篇中我们看到了Power BI在移动端的支持,从这一篇起降依次介绍Power BI中的各个功能组件,此篇讲通过一个故事来介绍如何在Power Query中获取并且组织数据. 在这个系列中,我们将 ...

  4. SQL Server 2014 BI新特性(三)Power Query和Power Map功能预览

    Power Query和Power Map是微软前不久在WPC上发布的Power BI中新的针对Excel的功能.借助这两样功能,自助式BI将更方便你发现和处理数据并且丰富数据的可视化功能. Powe ...

  5. 一张图看懂微软Power BI系列组件

    一.Power BI简介 Power BI是微软最新的商业智能(BI)概念,它包含了一系列的组件和工具.话不多说,直接上图吧: Power BI的核心理念就是让我们用户不需要强大的技术背景,只需要掌握 ...

  6. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  7. 一起学微软Power BI系列-使用技巧(2)连接Excel数据源错误解决方法

    上一篇文章一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库中,我们介绍了Power BI Desktop中连接Oracle和Mysql的方法,其实说到底还是驱动的问题, ...

  8. 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍

    我们在前一篇文章微软新神器-Power BI,一个简单易用,还用得起的BI产品中,我们初步介绍了Power BI的基本知识.由于Power BI是去年开始微软新发布的一个产品,虽然已经可以企业级应用, ...

  9. 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模

    我们前2篇文章:一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍 和一起学微软Power BI系列-官方文档-入门指南(2)获取源数据 中,我们介绍了官方入门文档与获取 ...

随机推荐

  1. The usage of Markdown---目录

    更新时间:2019.09.14   当我们编辑的内容比较多时,通常要生成目录来进行页内跳转.除了之前提到过的页内跳转链接的方法,还有一种方法--目录树,能够自动生产目录,大大减少工作量. tip1: ...

  2. css伪类选择器的查找顺序

    当伪类选择器last-child.first-child无效时,就是因为不了解css伪类选择器的查找顺序造成选中某一元素失败. 先给出一段dom <body> <div>第一个 ...

  3. java和python对比

    一:解释性和编译型 梳理 编译型:源代码经过编译直接变为二进制的机器语言,每次都可以直接重新运行不需要翻译.典型的就是c语言. 解释性:java和python都是解释型,源代码经过编译变为字节码文件, ...

  4. Web for pentester_writeup之Commands injection篇

    Web for pentester_writeup之Commands injection篇 Commands injection(命令行注入) 代码注入和命令行注入有什么区别呢,代码注入涉及比较广泛, ...

  5. Java线程学习详解

    线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...

  6. [爬虫]用python的requests模块爬取糗事百科段子

    虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更 ...

  7. CSPS模拟 41

    说不会鸽就不会鸽的 虽然是炸裂的一场 T1没读懂题,T23交了两个无脑暴力 (公式懒得打了 latex过于感人) T1 点阵内不重合的直线有多少条? 枚举斜率,那么“后继”不在点阵内的点可以作出一个贡 ...

  8. 1、第一个TensorFlow程序

    import tensorflow as tf import os os.environ[' #去掉警告,将警告级别提升 a = tf.constant(2) #定义一个常量 b = tf.const ...

  9. 吉利WA数

  10. 如何在Vue-cli项目中使用JTopo

    1.前言 jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包.其体积小,性能优异,由一群开发爱好者来维护.唯一感 ...