Power BI之DAX神功:第2卷第16回 为何要学习时间智能函数因为有时它不易替代
我们以DATEADD为例:
一、DATEADD平移年可以写出替代方案
《DAX神功》第2卷第12回 讲到了DATEADD函数(既可以环比,又可以同比)
DATEADD返回在时间维度上平移后的一组日期。有下面一张表:

【新建表】表1 = DATEADD('Sheet1'[日期],-1,year)
// 红框内是新建表返回的结果,返回最大日期向前一年的一组数据

替代方案的计算思路:

《DAX神功》答网友问05 返回表的迭代函数你应该注意什么?
我们讲解了Selectcolumns选择原表中的列生成一张新表,Addcolumns是在原表上增加列
上图中,第二步,我们可以使用Values或DISTINCT函数对指定列去重返回表。

去重后,我们将每一行的年份减掉1,得到下表
【新建表】测试 = SELECTCOLUMNS(Values('Sheet1'[日期]),"日期",DATE(YEAR('Sheet1'[日期])-1,MONTH('Sheet1'[日期]),day('Sheet1'[日期])))

这时就要提到我为什么要先讲《火力全开》再讲《DAX神功》,大家在学习DAX原理时应该发现了这个问题,从来没讲的过的函数拿来就用。
《The Definitive Guide to DAX》也是如此。例如今天我们要使用的TREATAS 函数【无关系情况下查找匹配】详见《火力全开》笔记24.02
函数语法是招式,原理是内功,能耍出降龙十八掌的,不一定是洪七公,也可能是演员+特效。况且你连招式都没见过,冒然学习原理,你听到的大多是这句话:“孙兴华不讲原理,他坑人误导人,少年,我看你骨骼惊奇,是万中无一的练武奇才,维护世界和平就靠你了,我这里有本武功秘籍,见与你有缘,就十块卖给你了”。哪里是有缘,明摆着诋毁别人推销自己。
我曾经做过一个梦,张三是个富二代,父亲去世后他继承了财产,他看到自家经营的产业已无优势,于是抵押了全部家当向银行贷款研发手机,但是手机销量不好,于是他开始剑走偏锋,专门研究百元机,但是销量仍然不好,这时,他雇佣水军,炮哄华米OV,说他们不经营百元机。结果华米OV高层坐到一起商量了一下,四大厂商决定将千元机卖百元机的价格,赔点钱不算什么,有高端机挣钱低端机赔钱,最终控制盈利就行了。一年之后,张三输光了全部家当,从一个富二代变成了老赖。好好的做生意,清清白白的做人不行吗?

TREATAS函数
作用:就是把一参当作二参的筛选器,通过一参筛选二参。
【新建表】
表2 = treatas(SELECTCOLUMNS(Values('Sheet1'[日期]),"日期",DATE(YEAR('Sheet1'[日期])-1,MONTH('Sheet1'[日期]),day('Sheet1'[日期]))),'Sheet1'[日期])

上述代替方案在平移年情况下是有效的,但是平移月时,DATEADD就显示出自己的优势了。
二、DATEADD平移月份
【新建表】表1 = DATEADD('Sheet1'[日期],-1,MONTH)

如果,我们照猫画虎,按平移年的方法平移月份,你会发现错误的返回结果:
【新建表】表2 = treatas(SELECTCOLUMNS(DISTINCT('Sheet1'[日期]),"日期",DATE(YEAR('Sheet1'[日期]),MONTH('Sheet1'[日期])-1,day('Sheet1'[日期]))),'Sheet1'[日期])

使用TREATAS函数第1参筛选第2参:

结果对比:会发现丢失了很多日期,是因每一行日期月份减1造成的。

以后,遇到您的方案是否可以代替时间智能日期函数时,建议亲自验证,以结果为准。
友情提示:《The Definitive Guide to DAX》关于理解DATEADD函数提供了3个规则(案例),很有参考价值,当你理解了上述原理之后,这3个案例是对你理解的加强。

《孙兴华讲PowerBI火力全开》PowerBI必学课程
https://www.bilibili.com/video/BV1qa4y1H7wp
《DAX神功》文字版合集:
https://www.bilibili.com/read/readlist/rl442274
《DAX神功》视频版合集:
https://www.bilibili.com/video/BV1YE411E7p3
PowerBI(DAX函数)、PowerQuery(M函数)、Python办公自动化、Python爬虫、Python数据分析、ExcelVBA、WordVBA、AccessVBA、MySQL等等