DAX基础12:Time Intelligence函数简介

浏览: 104

“去的尽管去了,来的尽管来着;去来的中间,又怎样地匆匆呢?早上我起来的时候,小屋里射进两三方斜斜的太阳。太阳他有脚啊,轻轻悄悄地挪移了;我也茫茫然跟着旋转。于是——洗手的时候,日子从水盆里过去;吃饭的时候,日子从饭碗里过去;默默时,便从凝然的双眼前过去。”

12.1.png

仔细想想,大多的数据分析都是一定会有基于时间方面的分析要求的。区别大概就是要么到时分秒,要么到年月日季度。er...数据分析,我理解的,就是基于每天正常发生的事务(数据来源),为了更好的帮助决策(分析方向),进行一定的计算处理。数据来源是基于每天发生,那基本各个行业都会对数据进行时间周期方面的分析。

对于时间方面的分析。本文中,只写到年月日季度。适用于各种基本需求。理解了,基本就可以修修改改直接Copy(复制),Paste(粘贴)了。

  1. 准备数据

    用的之前DAX基础6的数据表。包括一个事实表Sales;和两个维度表,一个是描述Customer信息的,一个是描述Product信息的。

    12.2.png

因为需要针对时间维度信息分析,所以需要添加一个Date表。

 a. 新建一个Date Table

建模tab标签页里面,点击“新表"

12.3.png

然后复制粘贴以下代码:

Date =

ADDCOLUMNS( 

CALENDAR(MIN(Sales[Order Date]),MAX(Sales[Delivery Date])),  

"Year", YEAR([Date]), 

"Month Number",MONTH([Date]),   

"Month Name", FORMAT([Date],"mmm"),   

"Quarter",QUARTER([Date]), 

"Year Month", YEAR([Date]) & "-" & FORMAT([Date],"mmm"),   

"Sort", YEAR([Date]) *100 +MONTH([Date]) 

)

12.4.png

"----"后面的是注释,帮助理解的内容。

因为是数字类型,所以会有汇总符号。可以在建模tab里面调整数据类型。

注意:点中最右边”字段“中,表Date的Column的名称(e.g. Date)才能修改相应的数据类型。点中!

12.5.png

b. 建立关系

数据是很实在的,她只会按照预先的设定去呈现数据所以为了不让自己混乱,对于一个事实表Sales和一个Date表。只能建立一个对应关系。所以如果你要分析Order Date和Delivery Date的时候。你有两种选择。或者建立一个Date表,然后分别建立两次关系,或者建立两个Date表,分别和Sales表做关联。优缺点如下图。

12.6.png

也可以理解。比如,用Order Date表里的Year Month做时间筛选,她只能是说在特定Order Date下对应的Delivery Date的筛选,是间接的。

按照方案1做了两个Date表。创建一个矩阵表,如下图所示。

12.8.png

如果我筛选2007年1月,那得到的Delivery Date就会是2007年1月和2月。

12.9.png

所以,如果想做查看一个时间段内,产品订单量和出货量的值,还是需要一个Date表,然后建立一个实关系一个虚关系来做计算的。

注意!虚关系是需要做的。USERELATIONSHIP函数只是一个开关。有开关没线路也是不对的。

本文主要是说Time Intelligence函数。USERELATIONSHIP函数和虚关系的内容可以参考DAX基础6. 以下内容都是基于Order Date这个时间来分析的。

!首先,把Date表的Date标记为日期!

12.15.png


  • YTD Year to date 年初到现在的累计和

    这个之前DAX分享2的时候写过一点,可以用DATESYTD函数或者TOTALYTD函数。其中TOTALYTD函数其实是内置了CALCULATE函数。

    语法略有不同。

Sales Amount YTD =

CALCULATE(

    Sales[Sales Amount],

    DATESYTD('Date'[Date])

)

12.10.png

  • 去年同期:比如今天是2020年1月,那去年同期就是2019年1月。

Sales Amount Last Year the same period =

CALCULATE(

Sales[Sales Amount],

SAMEPERIODLASTYEAR('Date'[Date])

)

20.11.png

  • 3个月前数据值

你也可以算一年前,几年前,对应月份下的值    

Sales Amount 3 months before =

CALCULATE(

Sales[Sales Amount],

DATEADD('Date'[Date],-3,MONTH)

)

你也可以用函数PARALLELPERIOD,结果一样

Sales Amount 3 months before =

CALCULATE(

Sales[Sales Amount],

PARALLELPERIOD('Date'[Date],-3,MONTH)

)

如果是上个月,还可以用PREVIOUSMONTH函数。

Sales Amount 1 months before =

CALCULATE(

Sales[Sales Amount],

PREVIOUSMONTH('Date'[Date])

)

12.12.png

  • 连续3个月的累计求和

Sales Amount running 3 months total =

CALCULATE(

Sales[Sales Amount],

DATESINPERIOD('Date'[Date],LASTDATE('Date'[Date]),-3,MONTH)

)

12.14.png

注意LASTDATE函数。在使用DATESINPERIOD或者DATESBETWEEN这些可以计算区间的函数的时候,你想要的当前时间值,可以通过LASTDATE取。

  • 去年同期YTD计算

Sales Amount YTD Last Year =

CALCULATE(

Sales[Sales Amount],

DATESYTD(

SAMEPERIODLASTYEAR(NEXTMONTH(PREVIOUSMONTH('Date'[Date])))

))

12.16.png

可以嵌套使用。非常的灵活好用。

12.13.png

就是这么简单的。非常非常的简单!我这么懒的人是不可能介绍很复杂的东西的 。相信我,DAX真的很简单。你只要明白想要的内容,然后拼拼凑凑就可以做出来了。Power BI的计算能力还是可以的。

计算大概就是这些了。有特殊需求的,比如说今年不是全年,所以希望去年也不要计算全年之类的。其实也都很简单。

提示:关于Date的属性描述都在Date表里面,你想让显示的和不显示的区别开来,要有一个固定的逻辑去区分你要显示的和不显示的。然后做个过滤就可以了。这个时候就是建立Calculated Column的时候。

按照这个思路去思考。

图4.0.png

拜托拜托,都看到这里了,关注下撒。写起来也不容易的。您的支持是我最大的动力!谢谢!

05m.jpg

推荐 0
本文由 懒胖子 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册