zoukankan      html  css  js  c++  java
  • Power BI 了解DAX中LASTDATE和MAX之间的区别

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

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

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

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

    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] ) )

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    学习Spring-Data-Jpa(二十二)---事务处理
    学习Spring-Data-Jpa(二十一)---DataSource与JPA属性配置
    学习Spring-Data-Jpa(二十)---@EnableJpaRepositories
    学习Spring-Data-Jpa(十九)---JPA的持久性上下文
    学习Spring-Data-Jpa(十八)---JPA的继承策略
    REST简介
    H5离线缓存机制-manifest
    Javascript 异步加载详解
    jQuery Ajax 实例 全解析
    整屏滚动效果 jquery.fullPage.js插件+CSS3实现
  • 原文地址:https://www.cnblogs.com/Javi/p/13672230.html
Copyright © 2011-2022 走看看