Power BI之DAX神功:答网友问12 为什么LastDate与Max结果不同
一、网友提问

二、理解FirstDate、LastDate函数与Min、Max函数的区别

FirstDate返回首个日期的表、LastDate返回最后一个日期的表

《火力全开》笔记27.补充1 我们讲解了LastDate与Max的区别,FirstDate与Min同理,它们有各自不同的应用。

综上所述:
【度量值】总销售 = sum(Sheet1[销售])
【度量值】L销售 = CALCULATE([总销售],LASTDATE('Sheet1'[日期]))
// LASTDATE('Sheet1'[日期]) 返回最大日期的表
【度量值】M销售 = CALCULATE([总销售],FILTER('Sheet1','Sheet1'[日期]=max('Sheet1'[日期])))
// FILTER('Sheet1','Sheet1'[日期]=max('Sheet1'[日期])) 返回最大日期的表
// 《The Definitive Guide to DAX》中使用filter+ALL(列),在这个案例上与filter+表的结果是一样的,想了解具体原理请看:
Power BI之DAX神功番外篇:第1回 Calculate+ALL表 与 Filter+ALL表 是两个概念
https://www.bilibili.com/read/cv13590816
但是,你无法使用LASTDATE替换Max
【度量值】错误 = CALCULATE([总销售],FILTER('Sheet1','Sheet1'[日期]=LASTDATE('Sheet1'[日期])))

产生错误的原因:



这样的效果大家一眼就能看出,LastDate与FirstDate具有转换行上下文的功能。Max是聚合函数它返回一个值,但是套上Calculate后就将行上下文转换成了筛选上下文,LastDate与FirstDate本身就具备这个功能。
我们做“半累加计算”时,LastDate与FirstDate不能替换Max与Min函数
三、LastNonBlank与FirstNonBlank函数
详见《DAX神功》第2卷第14回 我们经过证明,当你的销售表中日期列日期不连续,但是你使用了日期表,你的日期表是连续的,假设你日期1月31日在销售表中不存在,但是日期表中有1月31日,那半累加计算时1月就显示为空。解决方案使用LastNonBlank函数或者直接使用销售表[日期列]。
我们在《火力全开》笔记15 中详细介绍了这两个函数:

例1:返回Sheet2中第一个销售非空的日期
【新建表】
表 = FIRSTNONBLANK ( 'Sheet2'[日期], CALCULATE ( SUM ( 'Sheet2'[销售] ) ) )

例2:返回每人第一个不为空的销售
【度量值】
总销售=SUM ( 'Sheet2'[销售] )
销售 = CALCULATE ([总销售],FIRSTNONBLANK ( 'Sheet2'[日期], CALCULATE ( SUM ( 'Sheet2'[销售] ) ) ))


《孙兴华讲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等等