许多刚开始使用DAX的小伙伴在使用LASTDATE搜索某个时间段内的最后日期。或者他们使用NEXTDAY检索给定日期之后的日期。尽管这些函数可以实现它们所承诺的功能,但它们并不打算在简单的表达式中使用。相反,它们是设计用于时间智能计算的表函数。错误地使用它们会导致代码效率低下。此外,以未设计的方式使用这些功能是一个明显的信号,表明开发人员仍未掌握DAX的某些细节。

在本文中,我们将详细介绍该主题,以便了解这些时间智能功能的作用。我们还想了解在日期上将它们与简单的数学混淆如此容易的原因。我们想通过例子来详细阐述这个话题。因此,我们从无聊的理论开始,而不是从一个计算开始,尽管这种计算工作得很好,但它本质上是错误的。

计算给定选择中包含的天数,并生成如下所示的报告。

计算DaysInPeriod很简单:天数是时间段中第一个日期和最后一个日期之间的差。DAX提供了两个功能:FIRSTDATE和LASTDATE,这似乎是完美的候选者:

Days in period :=INT ( LASTDATE ( 'Date'[Date] ) - FIRSTDATE ( 'Date'[Date] ) )

这项措施可以正常工作并产生正确的结果。因此,我们很高兴!对?错误。我们不满意,因为我们使用LASTDATE来检索一个时间段内最后一个可见日期的值。LASTDATE完全执行此作业,但它返回一个包含最后日期的表-不仅是日期。让我重复一遍:它不返回日期。它返回一个包含日期的表。

这样做的原因是LASTDATE是时间智能功能。其主要目的是用作CALCULATE中的过滤器参数。CALCULATE过滤器参数是表。因此,要使函数在以下度量中使用,它需要返回一个表:

SalesOfLastDay =CALCULATE (    [Sales Amount],    LASTDATE ( 'Date'[Date] ))

您可以使用DAX Studio 再次检查LASTDATE的结果。LASTDATE返回一个表。这就是为什么您可以在EVALUATE语句中使用它的原因,该语句需要一个表作为结果。

如您所见,结果是一个表,其中包含一列(Date)和最后一个日期的值。

在DAX中,可以使用仅包含一行和一列的表(即您从LASTDATE获得的结果)代替内部的值。实际上,单行一列的表仅包含一个值。这就是DAX允许您将表自动转换为值的原因。这也是您可以在我们的度量中减去两个表的原因:

Days in period :=INT ( LASTDATE ( 'Date'[Date] ) - FIRSTDATE ( 'Date'[Date] ) )

实际上,LASTDATE和FIRSTDATE都返回表。因为我们使用的是减法运算符,所以DAX会将两个表转换为标量值,然后计算表内包含的值之间的差。

尽管此行为是透明的,但它是有代价的。表示先前计算的一种更好的方法是使用标量函数,例如MIN而不是FIRSTDATE和MAX而不是LASTDATE。MIN和MAX不返回表:它们返回第一个和最后一个日期的值。因此,以下是对措施的更好表述:

Days in period MIN MAX :=INT ( MAX ( 'Date'[Date] ) - MIN ( 'Date'[Date] ) )

同样,您可以使用DAX Studio 再次检查MIN和MAX的结果。如果您尝试使用MAX而不是LASTDATE作为EVALUATE语句的结果,则会出现错误。

为了获得EVALUATE的结果,您需要构建一个包含最大日期的表。例如,您可以使用表构造函数执行此操作。

如前所述,DAX自动将具有一行和一列的表转换为值。但是这种行为是有代价的。此外,LASTDATE和FIRSTDATE都在查找第一个和最后一个日期之前执行上下文转换。此行为不会影响我们的简单示例,但是仅由于此方面,在更复杂的情况下性能可能会很差。

本文是DAX 101;因此,它应该在这里结束。但是,当然,我们不禁为您中最好奇的人提供更多详细信息。您如何检查公式的两个版本之间的行为差异?

通过使用DAX Studio,您可以分析此查询的服务器时间:

----    This version uses FIRSTDATE and LASTDATE--EVALUATESUMMARIZECOLUMNS (    'Date'[Year Month],    "Daysin period", [Days in period])

尽管速度非常快,但是可以从服务器计时中看到引擎必须两次实现Date表:一次用于Date [Date]列,一次用于两列Date [Date]和Date [Calendar Year Month],生成两个具有2,556行的数据缓存。公式引擎(FE)随后扫描这些数据缓存以计算所需的结果。

通过这种简单的计算,当查询使用优化版本MIN MAX内的天数 时,查询不会更快。仍然,在实现方面要好得多,因为将整个计算下推到存储引擎(SE),该引擎将生成具有87行的单个数据缓存:与查询结果相同的行数。因此,期间MIN MAX中的天数将通过SE执行的完整计算产生最佳实现。在较大的模型或更复杂的场景中,实现上的这种微小差异可能会产生巨大的影响。

请注意,大多数时间智能功能(例如FIRSTDATE,LASTDATE,NEXTDAY,PREVIOUSDAY …)都显示相同的行为:它们返回一个可以自动转换为标量值的表。但是转换的代价是不值得付出的。

了解函数的一些本质也是变相的改善报告的性能,就也是为什么我在之前的文章中一再强调某些函数是如何运算,可能很多小伙伴只注重结果正确而忽略了一些细节。

中天数相减获得差_Power BI 了解DAX中LASTDATE和MAX之间的区别相关推荐

  1. mysql中日期相减_Excel教程:Excel日期问题的小妙招

    通知:安卓APP以发布课程可以缓存下载和倍速看 IOS系统(内测中,请公众号左下角学习) 1.怎么快速输入当前日期? 函数: 输入公式:=TODAY() TODAY函数:返回日期格式的当前日期. 搜狗 ...

  2. 158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能

    158_模型_Power BI 使用 DAX + SVG 打通制作商业图表几乎所有可能 一.背景 最近对 Power BI 中使用 SVG 比较感兴趣,今天我们使用 DAX + SVG 复刻一下 Ze ...

  3. mysql中日期相减_非凡教育教你excel怎么计算两个日期天数差和时间差

    商务办公培训老师在本文中主要是介绍如何在excel中计算日期和时间,包括两个日期之间的天数.时间之间的差和显示样式. 首先,计算两个日期之间的天数.在excel中,两个日期直接相减就可以得到两个日期间 ...

  4. mysql中日期相减_解放双手!用这3个日期函数解决入职、工龄等天数的计算

    人事部门员工的入职天数.财务部门合同的到期剩余天数等等,可以通过Excel表格来实现自动计算功能. 今天小编分享三个与日期有关的函数 一.EDATE函数 很多公司新员工入职会有3个月试用期,根据入职日 ...

  5. mysql中日期相减_Excel日期和时间运算

    对于Excel的日期和时间运算一般人都很头疼,文章的开始我先给大家说个真理吧,遇到这种问题,不管三七二十一,直接暴力相加或相减,然后把运算结果设置成日期或时间格式,结果也许就有了. 下边我把日期和时间 ...

  6. c语言 地址+1,C语言中,为什么指针表达式的值+1.对应的地址值却+4?/为什么两个数组元素的地址相减之差不为地址之差?...

    在C语言中,我们常常用到的一个运算是让某个变量的值+1. 例如 M = M + 1. 而在实际运用中,我们发现 对于指针进行+1运算,算出来的结果是+4. 如下图 图中我们定义的 变量M 和指针Mat ...

  7. Excel中时间相减的实例教程

    在上一篇文章我们学习了excel时间计算的基础知识,知道了时间对应的小数差值,我们将这个差值再乘以24就可以计算结果的单位转换为小时.理解了Excel处理时间的规律,有助于理解公式的含义.我们接下来就 ...

  8. Oracle中时间相减得到天、时、分等

    背景: 数据库中有两个字段如下: 现在想通过这两个字段得到分钟数,通过观察两种日期格式为:'年月日时分秒',我们需要先把字符串转换成日期格式,使用to_date函数,对应的字符串格式为'YYYYMMD ...

  9. sql 数据库语句中日期相减

    sql中两个日期相减 1.相差天数 select trunc(sysdate,'yyyy')-to_date('2009-01-04','yyyy-mm-dd') from dual; 2.相差月数 ...

最新文章

  1. 深度剖析不一样的Redis架构设计!
  2. UVa11389 The Bus Driver Problem(贪心)
  3. 带你学python基础:模块和包
  4. 【设计模式】两大策略和六大原则
  5. python字典包含指定键_python-字典中所有值的总和,其中包含键中的项
  6. using关键字的用法以及作用
  7. 4-2017-12-2-2约瑟夫环
  8. 音乐艺考生如何提高视唱练耳技巧
  9. 视频播放器本地代理服务设计
  10. Darabonba:多语言SDK开发终极解决方案
  11. 计算机的的打印服务,Win7系统print spooler打印机服务自动停止处理办法
  12. MSVAR能用MATLAB做吗,MS-VAR模型(MSVAR)建模心得(干货)
  13. 4针串口线接法图_​RS232串口线常见接法与引脚定义
  14. 基于眼电信号(EOG)的眨眼检测算法
  15. java 多媒体处理_Java 多媒体处理包 JAVE
  16. 微信机器人API开发
  17. CPAL脚本自动化测试 ———— Diagnostic 系列函数
  18. proftpd 530 Login incorrect
  19. 微信小程序登录功能wx.login
  20. 理解 假阳性(false positive)和假阴性(false negative)概念

热门文章

  1. beforeRouteEnter,beforeRouteLeave函数
  2. USB转WIFI无线网卡驱动程序(RT5370驱动程序)的移植记录之一
  3. 前端基础_认识前端.md
  4. [SDOI 2010]外星千足虫
  5. JavaSE--类加载器
  6. sublime2使用和配置
  7. SharePoint 2010 RBS 安装和配置遇到的一个问题
  8. [Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]
  9. [Leedcode][JAVA][第98题][验证二叉搜索树]
  10. Java学习笔记11-1——Spring5