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

时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析。假设要计算上年同期的销量,在PowerBI中可以用CALCULATE来写个度量值[上年同期],

= CALCULATE([数量],
SAMEPERIODLASTYEAR('日期表'[日期]))

这里SAMEPERIODLASTYEAR就是时间智能函数。

时间智能函数和普通函数的区别

时间智能函数与普通的时间或者日期函数的区别是,

  • 日期函数直接依赖当前行上下文,一般作为新建列使用,比如YEAR函数,提取日期列的年度;
  • 时间智能函数会重置上下文,一般新建度量值时使用,可以快速移动到指定区间

时间智能函数有哪些

在PowerBI中,目前共有33个时间智能函数,列表如下:

看起来好像很多,很难记,其实都是用很直白的英文表达,函数名的意思就是这个函数的功能,有些函数都包括几个粒度,比如PREVIOUSYEAR/QUARTER/MONTH/DAY,上一年/季/月/天,还有相反方向的下一年/季/月/天,NEXTYEAR/QUARTER/MONTH/DAY,这8个函数可以看作是一类,上表中排序也是把同一类的函数按顺序放到了一起,这样看下来并没有几种。

根据这些时间智能函数计算的结果,我把时间智能函数分为以下两类:

  • 返回期间的时间智能函数

返回期间并执行运算的时间智能函数

返回期间的时间智能函数

前24个函数都属于这种,其中前20个时间智能函数都是非常简单的,只需要使用一个日期参数就可以,返回对应的时间期间,一般结合CALCULATE使用,比如本文开头的SAMEPERIODLASTYEAR看起来很长,其实非常简单,从函数名称可以看出它是干什么的:上年同期。

第21至24,DATEADD、DATEBETWEEN、DATESINPERIOD 、PARALLELPERIOD ,这4个函数相对复杂一点,但也就是参数多了两个而已,一般用于相对时间区间的控制,请看下图中对这4个函数的介绍。

返回期间并执行运算的时间智能函数

从第25个开始,最下面这9个函数更加智能,不仅可以重置上下文,甚至直接对重置后的下上文执行运算,把CALCULATE都省掉了,比如求年初至今的销量,使用TOTALYTD函数:

=TOTALYTD([数量],日期表[日期])

它和之前使用DATESYTD的效果等同

=CALCULATE([数量],DATESYTD(日期表[日期]))

OPENINGBALANCEYEAR,返回当前行上下文对应的年初余额,如果这个销售记录表上还有一列当日结束时的[库存量],新建度量值

=OPENINGBALANCEYEAR(销售记录表[库存量],
日期表[日期])

将返回2017年的年初库存,也就是2016年12月31日结束时的库存量。

CLOSINGBALANCEYEAR/QUARTER/MONTH计算年/季/月末的数据,参数和使用方法类似。

涉及年度的时间智能函数的特殊用法

在33个时间智能函数中,有8个是关于年度的,

DATESYTD 
PREVIOUSYEAR 
NEXTYEAR 
ENDOFYEAR 
STARTOFYEAR 
TOTALYTD 
CLOSINGBALANCEYEAR 
OPENINGBALANCEYEAR

这8个函数的参数中最后都有一个可选参数<year_end_date>,意思是年度结束日期,默认情况下就是自然年度的结束日期12月31日,可以省略,在特定的分析中,年度结束日期不是12月31日,那么可以使用这个参数来界定。

在进行财年的分析时,很多国外的公司的财年都不是自然年度,比如苹果的财年结束日期9月30日,2017财年就是从2016年10月1日到2017年9月30日,计算2018财年的年初至今的销量:

=CALCULATE([数量],DATESYTD(日期表[日期],"9-30"))

等同于

TOTALYTD=([数量],日期表[日期],"9-30")

都将返回从2017年10月1日到目前的累计销量。

其他几个函数不再一一介绍。

时间智能函数与日期表

使用时间智能函数时若出现一些莫名其妙的错误,或者返回的数据难以解释,很大可能是你使用的时间参数有问题。

为了科学的使用时间智能函数,首要的就是建立一个合格的日期表,并将日期列与事实表的日期列建立关联。

合格的日期表具备以下的特征:

  • 起止日期涵盖事实表的所有日期
  • 日期是连续且不重复的

如何生成日期表,有很多方法,可以用Excel、M函数也可以用DAX生成,这里就不细说了,日期表导入到PowerBI Desktop后,首先要把它标记为日期表,

因为日期表的起止日期我们很容易查看是否涵盖,但是否连续不重复却并不能轻易看到,标记为日期表的好处是,它会强制检查日期表的日期列是否为日期格式、是否为连续的、不重复的,如果不是,则无法进行标记,这样的强制要求保证了后面使用时间智能函数时,不会出现这方面的错误。

日期表并不一定要按照网上搜罗的方法生成同样的粒度列,而是要根据实际分析的需要,建立适合的相关列,比如要按财年来分析,就要按照财年的起止日期来添加财年列;如果要进行最近12个月的滚动分析,就添加一个月份编号。

日期表包含分析需要的维度列,可以简化DAX的嵌套,建立简单的度量值就可以轻松聚合所需要的数据。这也是合格的日期表和优秀的日期表的分界线。

时间智能函数并没有什么神秘,熟悉它使用的参数、搞清它重置的日期区间和返回的数据类型,就掌握了它,在实际分析中多加练习就可以灵活的使用这些函数。选取特定的时间粒度,快速筛选统计区间,轻松搞定时间序列分析。

数据可视化之DAX篇(十二)掌握时间智能函数,同比环比各种比,轻松搞定!的更多相关文章

  1. 数据可视化之DAX篇(二十八)Power BI时间序列分析用到的度量值,一次全给你

    https://zhuanlan.zhihu.com/p/88528732 在各种经营分析报告中,我们常常会看到YTD,YOY这样的统计指标,这样的数据计算并不难,尤其是在PowerBI中,因为有时间 ...

  2. 数据可视化之DAX篇(二十六)Power BI度量值:滚动聚合

    https://zhuanlan.zhihu.com/p/85996745 上一篇文讲了累计聚合,这篇文章继续讲一下滚动聚合,比如常用的MAT计算,Moving Annual Total,滚动年度总计 ...

  3. 数据可视化之DAX篇(二十五)PowerBI常用的度量值:累计至今

    https://zhuanlan.zhihu.com/p/64999937 经常碰到本年至今.本月至今的数据计算,其实还有一类计算是,从历史最早日期至今的累计计算,比如从开业到现在总共卖出了多少件商品 ...

  4. 数据可视化之DAX篇(二十三)ALLEXCEPT应用示例:更灵活的累计求和

    https://zhuanlan.zhihu.com/p/67441847 累计求和问题,之前已经介绍过(有了这几个公式,你也可以快速搞定累计求和),主要是基于比较简单的情形,针对所有的数据进行累计求 ...

  5. 数据可视化之DAX篇(二十)Think in DAX 之报表自动化实践

    https://zhuanlan.zhihu.com/p/107672198 ​本文来自星友袁佳林的实践分享,他参加了PowerBI星球中的DAX圣经第二版100天学习打卡活动,已持续分享近100天, ...

  6. 数据可视化之DAX篇(二十四)Power BI应用技巧:在总计行实现条件格式

    https://zhuanlan.zhihu.com/p/98975646 如何将表格或者矩阵中值的条件格式也应用于总计行? 目前PowerBI并不支持这种功能,无法在总计行或者小计行上应用条件格式, ...

  7. 数据可视化之DAX篇(二十二)一文搞懂Power BI中的排名问题

    https://zhuanlan.zhihu.com/p/68384001 本文聊聊在PowerBI中如何进行各种类型的排名问题. PowerBI中计算排名主要使用RANKX函数,关于该函数的具体语法 ...

  8. 数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

    https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来 ...

  9. 数据可视化之DAX篇(二十一)连接表的几个DAX函数,一次全掌握

    https://zhuanlan.zhihu.com/p/67015995 编写DAX代码进行业务分析时,经常会用到表与表之间的连接计算,比如在之前的产品关联分析一文中(如何用Power BI分析产品 ...

  10. 数据可视化之DAX篇(二十七)半累加度量,在Power BI 中轻松处理

    https://zhuanlan.zhihu.com/p/96823622 ​开始半累加的计算之前,我们先看看什么是累加.半累加以及不可累加数据. 在含有大量行的数据表中,各种数据处理语言,包括DAX ...

随机推荐

  1. ESP8266服务器模式 发送数据和接收数据 模板1

    功能如下: 1.将客户端发来的数据转发到串口:2.串口数据转发给所有客户端3.可连接4个客户端4.可设置静态IP地址5.指示灯闪烁表示无客户端连接,灯亮代表有客户端连接 /** 功能: 1.将客户端发 ...

  2. Android开发学习笔记Intent 一

    Inten的概念 1.Intent是Android四大组件直接沟通的桥梁 2.Intent是一种运行时绑定(runtime binding)机制 Intent对象的属性 Itent的种类 Inten过 ...

  3. Merge,Rebase,Cherry-Pick 一文解惑

    代码合并在日常开发中是较为常见的场景,采用合适的合并方式,可以起到事半功倍的效果.对应在 Git 中合并的方式主要有三个,Merge,Rebase,Cherry-Pick. 开始部分会首先介绍一下这三 ...

  4. disruptor架构三 使用场景更加复杂的场景

    先c1和c2并行消费生产者产生的数据,然后c3再消费该数据 我们来使用代码实现:我们可以使用Disruptor实例来实现,也可以不用产生Disruptor实例,直接调用RingBuffer的api来实 ...

  5. 微信小程序 wx:if 多条件判断

    <view wx:if="{{a}}">单个条件</view> <view wx:if="{{a || b}}">多个或条件 ...

  6. 一不小心,我就上传了 279674 字的 MySQL 学习资料到 github 上了

    自从2019年11月我们出版了<千金良方--MySQL 性能优化金字塔法则>一书之后,持续不断有人来询问我MySQL 4 个系统字典库相关的问题,因为篇幅原因,书中并没有完整收录4个字典库 ...

  7. 当我们创建HashMap时,底层到底做了什么?

    jdk1.7中的底层实现过程(底层基于数组+链表) 在我们new HashMap()时,底层创建了默认长度为16的一维数组Entry[ ] table.当我们调用map.put(key1,value1 ...

  8. Redis系列(六):数据结构List双向链表LPUSH、LPOP、RPUSH、RPOP、LLEN命令

    1.介绍 redis中的list既实现了栈(先进后出)又实现了队列(先进先出) 1.示意图 2.各命令详解 LPUSH/RPUSH LPUSH: 从队列的左边入队一个或多个元素 将所有指定的值插入到存 ...

  9. 使用docker创建rocketMQ容器

    一.rocketMQ安装 (一)安装NameSrv 1.创建nameSrv数据挂载文件夹 mkdir -p /usr/data/rocketMQ/data/namesrv/logs mkdir -p ...

  10. 发家致富的鬼bug。让人心动

    这个bug是我目前见过最离谱的bug…… 颠覆了我二十多年的世界观,天上掉馅饼这种好事第一次砸我身上(雾),至今我都没想明白其中的原理. 情况是这样的,去年我出门去外地有些事情要处理.由于要呆很长时间 ...