https://zhuanlan.zhihu.com/p/68384001

本文聊聊在PowerBI中如何进行各种类型的排名问题。

PowerBI中计算排名主要使用RANKX函数,关于该函数的具体语法,不再细说,可以查看该函数的官方文档,也可以参照这个函数卡片:

↑ 知识星球每日函数卡片

下面通过几个示例来看看它的用法。


假设数据模型为一个订单表,以及对应的产品维度表和客户维度表,产品维度表有产品名称和产品类别。

下面分别按销售额对各种维度进行排名。

销售额 = sum('订单'[销售额])

对全部产品按销售额排序

首先写一个RANKX的最经典、最常用的代码,

排名 = RANKX(ALL('产品'),[销售额])

这样各产品的排名计算出来了,不过总计行的排名没有什么意义,可以加个判断条件不显示总计,

排名 = 
IF(HASONEVALUE('产品'[产品名称]),
RANKX(ALL('产品'),[销售额]))

以后遇到这种情况直接用IF+HASONEVALUE进行判断就行了,本文后面的度量值都不再考虑总计问题,并且直接不再显示总计。

上面的这个排名其实是绝对排名,无论选择几个产品,每个产品的排名是固定的。

按照所选的产品范围来排序,就是相对排名,可以结合ALLSELECT函数来实现,

整体相对排名 = 
RANKX(ALLSELECTED('产品'),[销售额])

这个是整体相对排名,那么第一个排名也改为整体绝对排名,效果如下,

在类别内对各产品排名

如果再把产品类别加进来,并让各产品在各自的类别内进行排名,同样也分为类别内绝对排名和类别内相对排名,

类别中 产品绝对排名 = 
RANKX(ALL('产品'[产品名称]),[销售额])

类别中 产品相对排名 = 
RANKX(ALLSELECTED('产品'[产品名称]),[销售额])

按子类别排名

如果想知道每个类别整体的销售情况排名,那么就需要计算出每个类别的整体销售额,度量值可以这样写,

按类别绝对排名 = 
RANKX(
ALL('产品'[产品类别]),
CALCULATE(
[销售额],
ALLEXCEPT('产品','产品'[产品类别])
)
)

同理,有了上面的经验,相对排名,把ALL替换成ALLSELECT即可,

按类别相对排名 = 
RANKX(
ALLSELECTED('产品'[产品类别]),
CALCULATE(
[销售额],
ALLEXCEPT('产品','产品'[产品类别])
)
)

排名效果如下,

按两个维度进行排名

上面是对各产品的销售额进行排名,如果增加一个维度,比如按产品在每个城市的销售额进行排名,

实际上是按照前两列的笛卡尔积进行排名,度量值可以这样写,

产品 城市 综合排名 = 
RANKX(
CROSSJOIN(
ALL('产品'[产品名称]),
ALL('客户'[客户城市])
),
[销售额]
)

总结

通过上面几个例子,除了可以计算排名,更可以帮助你更深入的理解RANKX的用法:

  • 对哪个维度进行排名,就构建一个对应的维度表,作为RANKX的第一个参数,动态就用ALLSELECTED;
  • 按什么排名,就写对应的表达式,作为RANKX的第二个参数。

RANKX还有三个可选参数,其中第四个和第五个都很容易理解,而第三个参数相对难理解一点,不过并不常用,无须刻意去深入,遇到了问题可以随时和我沟通。

以上几个示例基本涵盖了我们日常使用的大部分排名问题,可以通过观察输出的结果来理解度量值的写法。

数据可视化之DAX篇(二十二)一文搞懂Power BI中的排名问题的更多相关文章

  1. 数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!

    https://zhuanlan.zhihu.com/p/55841964 时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中 ...

  2. 数据可视化之PowerQuery篇(十二)客户购买频次分布

    https://zhuanlan.zhihu.com/p/100070260 商业数据分析通常都可以简化为对数据进行筛选.分组.汇总的过程,本文通过一个实例来看看PowerBI是如何快速完成整个过程的 ...

  3. 数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你

    https://zhuanlan.zhihu.com/p/64422393 经常有朋友提出一个问题,然后我给出一个DAX之后,TA又不是很理解,反复多次沟通才能把一个表达式讲清楚.或者TA自己写了一个 ...

  4. 数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式

    https://zhuanlan.zhihu.com/p/64418286 假设有一组数据, 已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体 ...

  5. 数据可视化之DAX篇(十九)值得你深入了解的函数:SUMMARIZE

    https://zhuanlan.zhihu.com/p/66424209 SUMMARIZE函数非常强大,掌握以后表面上看也非常好用,所以我专门写篇文章介绍一下这个函数,至于是否一定要使用该函数,请 ...

  6. 数据可视化之DAX篇(十五)Power BI按表筛选的思路

    https://zhuanlan.zhihu.com/p/121773967 ​数据分析就是筛选.分组.聚合的过程,关于筛选,可以按一个维度来筛选,也可以按多个维度筛选,还有种常见的方式是,利用几个特 ...

  7. 数据可视化之DAX篇(十四)DAX函数:RELATED和RELATEDTABLE

    https://zhuanlan.zhihu.com/p/64421378 Excel中知名度最高的函数当属VLOOKUP,它的确很有用,可以在两个表之间进行匹配数据,使工作效率大大提升,虽然它也有很 ...

  8. 数据可视化之DAX篇(十八)收藏 | DAX代码格式指南

    https://zhuanlan.zhihu.com/p/64422599 为什么要进行格式化? DAX 是一种函数式语言,正如我们已经学习的或者看到的,DAX 代码中总有一些函数带有几个参数,而参数 ...

  9. 数据可视化之powerBI技巧(十五)采悟:Power BI动态技巧:动态显示数据层级

    今天给大家分享一个动态显示数据层级的技巧,效果如下: 无论想按什么维度.什么顺序查看分析数据,只需要选择不同的切片器组合就行了. 方法如下:01 | 把数据聚合为分析需要的最细粒度 本文假设最细分析粒 ...

随机推荐

  1. firda安装和使用

    frida是一个轻量级别的hook框架. frida由两部分组成:一部分是运行在系统上的交互工具frida CLI,另一部分是运行在目标机器上的代码注入工具frida-server. 推荐使用pyth ...

  2. .NETCore微服务探寻(一) - 网关

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  3. JVM 之 Linux定位CPU过高问题及优化

    项目部署以后出行卡顿现象,所以对问题进行了排查,记录一下排查过程 (从CSDN编辑器贴过来的,图有水印) 1.找进程 top 可以发现,是Java进程导致的CPU过高,致使系统卡顿 2.找线程 ps ...

  4. ImportError: cannot import name _remove_dead_weakref

    出现这个错误, 和python环境有关. 电脑有多个版本造成的. python3 有这个_remove_dead_weakref python 2.7.10 并没有_remove_dead_weakr ...

  5. Spark3.0分布,Structured Streaming UI登场

    近日,在Spark开源十周年之际,Spark3.0发布了,这个版本大家也是期盼已久.登录Spark官网,最新的版本已经是3.0.而且不出意外,对于Structured Streaming进行了再一次的 ...

  6. 手写React的Fiber架构,深入理解其原理

    熟悉React的朋友都知道,React支持jsx语法,我们可以直接将HTML代码写到JS中间,然后渲染到页面上,我们写的HTML如果有更新的话,React还有虚拟DOM的对比,只更新变化的部分,而不重 ...

  7. twaver html5 如何设置节点不可拖动

    解决思路: 1.创建一个不可移动的图层  :  layer 2.设置不可拖动的节点node 的图层为 layer 见代码: var box = new twaver.ElementBox(); var ...

  8. 07.Easymock的实际应用

    第一步下载对应的java包添加到工程中 并静态导入所需要的j类 import static org.easymock.EasyMock.*; 这里有的注意点 package com.fjnu.serv ...

  9. android 6.0 以上在doze模式精确定时

    public static void start12hAlarm() { int seconds = TIMERLENGTH; ECMLog.i_ecms(CLASS_TAG, " star ...

  10. 四层发现-UDP发现

    udp发现要注意选择一个不常用的端口,如果目标ip在up时目标端口是开放状态,那么不管目标ip是否为up状态,都不会收到任何回应,只有在目标ip为down状态且目标端口为关闭状态,才会返回一个目标不可 ...