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

​今年是闰年,有星友问我,在Power BI中,2月29日的上年同期是怎么计算的?

这是个好问题,正好梳理一下,PowerBI时间智能函数是如何处理不规则日期的对比数据的。

以一个模拟的订单表数据为例,订单日期涵盖了2015年、2016年和2017年,其中2016年是闰年,添加一个相匹配的日期表与之建立关系,

先建立一个基础度量值:

收入 = SUM('订单表'[销售额])

然后通过下面几个示例,来看看几个和2月29日相关的各种数据,是怎么计算的?以及时间智能函数处理闰年的计算逻辑。

2月29日-上年同期

建个上年同期的度量值:

收入 PY = CALCULATE( [收入], SAMEPERIODLASTYEAR('日期表'[日期]) )

把这个度量值放入到矩阵中看看结果:

从上面的数据可以看出,2016年2月29日和28日的上年同期数据都是48000,与2015年2月28日的数据是一样的。

2016年2月28日的上年同期数据是2015年2月28日很正常,那么为什么2016年2月29日的上年同期数据也是2015年2月28日呢?

对于不规则的日期,根据特定的要求和逻辑,可以设计不同的对比方式。比如2015年是没有2月29日的,那么2016年2月29日的上年同期可以设计为空值。而PowerBI的时间智能函数的计算逻辑,是2月29日的上年同期数据为上年2月28日的,换个角度可能更容易理解,就是2月最后一天的数据对比,无论是不是闰年。

并且观察2017年2月28日的上年同期数据,与2016年2月28日的数据一样,这很正常。只是在2017年,找不到这样的日期:它的上年同期数据,可以与2016年2月29日对应。

2月29日-本年累计的上年同期

本年累计以及本年累计的上年同期度量值可以这样写:

收入 YTD = TOTALYTD([收入],'日期表'[日期])
收入 YTD PY = CALCULATE( [收入 YTD], SAMEPERIODLASTYEAR('日期表'[日期]))

计算结果如下:

本年累计的同期对比结果,与上面当日数据的同期对比逻辑是一样的,依然是2016年2月29日的上年同期,是2015年2月28日的数据。

从上图可以看到2017年2月28日上年同期的本年累计是4087000,但是如果看2017年2月份的上年同期本年累计,却是4129000,

也就是说在本年累计的上年同期的计算中,2017年2月28日的数据和2017年2月份的数据是不一致的。

但在月份这个粒度上,2017年2月的上年同期,与2016年2月的数据完全一致,并没有问题。

2月29日-本月累计的上月

需要建本月累计和上月累计的度量值,可以这样写:

收入 MTD = TOTALMTD([收入],'日期表'[日期])
收入 MTD PM = CALCULATE( [收入 MTD], DATEADD('日期表'[日期],-1,MONTH))

结果如下:

在月度环比上,因为每个月都有29号,29号本身的数据没有问题,但在3月30号和3月31号的上月同期计算中,因为2月没有对应的日期,所以都等于2月29日的数据。

关于月度环比,这个很正常,因为即使不是闰年,3月30日和3月31日的上月同期数据,也是都等于2月28日的数据。

在日期维度月度环比的计算上,不只是闰年有2月29日才存在这个问题,其实每年都存在,因为有的月份是31天,有的月份是30天,比如7月31号的上月同期数据就是6月30日的数据。

总结

通过上面几个示例,对时间智能函数的计算逻辑总结如下:

  • 日期粒度上的计算,如果没有对应的日期,会自动等于上期最后一天的数据;
  • 月份粒度上的计算,是否为闰年,没有任何影响;
  • 在本期累计的上期计算中,可能会出现,当月最后一天的累计数与当月的累计数不一致的情况。

以上就是时间智能函数的计算逻辑,其实没有必要担心2月29日的计算问题,就像不用担心某个月是否有31号一样。如果你的业务中,需要的计算逻辑不是时间智能函数的逻辑,应根据需求调整,按通用的DAX函数和规则来写度量值,并不是一定要用时间智能函数。

数据可视化之DAX篇(一)Power BI时间智能函数如何处理2月29日的?的更多相关文章

  1. 数据可视化之DAX篇(六) 利用ISINSCOPE函数,轻松按层级计算占比

    https://zhuanlan.zhihu.com/p/70590683 关于占比,之前有篇文章(利用ALL和ALLSELECTED灵活计算占比)详细介绍了各种情况下占比的度量值. 经星友咨询,还有 ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. 数据可视化之DAX篇(十一)Power BI度量值不能作为坐标轴?这个解决思路送给你

    https://zhuanlan.zhihu.com/p/79522456 对于PowerBI使用者而言,经常碰到的一个问题是,想把度量值放到坐标轴上,却发现无法实现.尤其是初学者,更是习惯性的想这么 ...

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

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

随机推荐

  1. 将pycharm中的代码上传到远程Ubuntu中

    no bb...下面直接放图开干...^_^

  2. Python基础——爬虫以及简单的数据分析

    目标:使用Python编写爬虫,获取链家青岛站的房产信息,然后对爬取的房产信息进行分析. 环境:win10+python3.8+pycharm Python库: import requests imp ...

  3. @loj - 6039@ 「雅礼集训 2017 Day5」珠宝

    目录 @description@ @solution@ @accpeted code@ @details@ @description@ Miranda 准备去市里最有名的珠宝展览会,展览会有可以购买珠 ...

  4. 使用redis实现nodejs并发服务

    const redisClient = require('redis').createClient(6379, '127.0.0.1'); const crypto = require('crypto ...

  5. 精美图文讲解Java AQS 共享式获取同步状态以及Semaphore的应用

    | 好看请赞,养成习惯 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it ...

  6. cb45a_c++_STL_算法_删除_(3)_unique(唯一的意思)删除连续性的重复的数据

    cb45a_c++_STL_算法_删除_(3)_unique(唯一的意思)删除连续性的重复的数据unique(b,e),删除连续性的,删除重复的数据,比如如果有两个连续的5,5,则留下一个.uniqu ...

  7. Java 多线程基础(十)interrupt()和线程终止方式

    Java 多线程基础(十)interrupt()和线程终止方式 一.interrupt() 介绍 interrupt() 定义在 Thread 类中,作用是中断本线程. 本线程中断自己是被允许的:其它 ...

  8. Elastic认证考试,请先看这一篇

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wojiushiwo987/article ...

  9. windows下 react-native环境搭建

    跟着慕课网做案例,搭建rn环境遇到很大问题. 下面说一下: 首先看一下文档:http://reactnative.cn/docs/0.44/getting-started.html#content 注 ...

  10. MFC线程(二):线程同步临界区CRITICAL SECTION

    当多个线程同时使用相同的资源时,由于是并发执行,不能保证先后顺序.所以假如时一个公共变量被几个线程同时使用会造成该变量值的混乱. 下面来举个简单例子. 假如有一个字符数组变量 char g_charA ...