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

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

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

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

62fae029036ee69e9716390df6f7d7d4.png

计算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语句中使用它的原因,该语句需要一个表作为结果。

098d6ad4e37361f4fac38c348c98fae3.png

如您所见,结果是一个表,其中包含一列(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语句的结果,则会出现错误。

82db19284aa5ac71c81ed559b8c9afbd.png

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

4602763dea06b9e167dd46d6d4af6f7f.png

如前所述,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)随后扫描这些数据缓存以计算所需的结果。

53d2ddd3d82728c4aea11fc3d1231159.png

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

c6b802cd9a649f988caa42f624581073.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434273.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python gif_python 将png图片格式转换生成gif动画

先看知乎上面的一个连接 用Python写过哪些【脑洞大开】的小工具? 这个哥们通过爬气象网站的气象雷达图,生成一个gif的动态图。非常有趣且很实用,那咱也实现下。 我们先实现一个从GIF提取帧的代码 我们这有个gif代码如下: from PIL…

HTTP代理原理以及HTTP隧道技术

通过HTTP协议与代理服务器建立连接,协议信令中包含要连接到的远程主机的IP和端口号,如果有需要身份验证的话还需要加上授权信息,服务器收到信令后首先进行身份验证,通过后便与远程主机建立连接,连接成功之后会返回给客…

goland环境配置_Goland辅助工具goimports和gomodules

1、goimports工具goimports工具是Go官方提供的一种工具,它能够为我们自动格式化 Go 语言代码并对所有引入的包进行管理,包括自动增删依赖的包引用、将依赖包按字母序排序并分类。我们在使用Goland IDE的时候,建议使用goimports工具。它具备包…

石头剪刀布python代码_python实现石头剪刀布程序

本文实例为大家分享了python实现石头剪刀布的具体代码,供大家参考,具体内容如下 概述: 如果你和我一样是一个有着其他语言基础的编程者,那我想这个小程序对于你来说是小case。由于本人初学Python,就先拿这个熟悉熟悉一…

ubuntu/wireshark --Lua: Error during loading: [string /usr/share/wireshark/init.lua]:45问题解决

错误如下: 解决方案:修改init.lua 直接运行wireshark的话会报错: Lua: Error during loading: [string "/usr/share/wireshark/init.lua"]:45: dofile has been disabled 要对其进行修改,终端运行 sudo gedit /usr…

ubuntu下IP、DNS配置

一、配置ip ubuntu的网络配置信息放在 /etc/network/interfaces 中,如果配置动态获取ip,则在上述文件中加入以下内容:auto eth0iface eth0 inet dhcp如果配置静态ip,则添加如下内容:auto eth0 iface eth0 inet statica…

python向空列表添加列表_Python列表核心知识点汇总

千里之行,始于足下。要练成一双洞悉一切的眼睛,还是得先把基本功扎扎实实地学好。今天带大家仔细温习一下Python的列表。温故而知新,不亦说乎。当然,温习的同时也要发散思考,因为有些看似无关紧要的、约定俗成的语言习…

sharepoint2010的弹出等待提示的对话框

根据MSDN的资料。我做了个测试&#xff0c;代码如下&#xff1a; <% Assembly Name"$SharePoint.Project.AssemblyFullName$" %> <% Assembly Name"Microsoft.Web.CommandUI, Version14.0.0.0, Cultureneutral, PublicKeyToken71e9bce111e9429c" …

java中输出值保留四位小数_Java工程师(3).变量和数据类型

变量什么是变量变量是内存中的一块存储空间&#xff0c;用于保存Java程序准备使用的数据。可以为变量赋予一个简短并易于记忆的名字方便我们使用变量的值。int 变量的声明因为经常要保存一些数据&#xff0c;所以变量是很常用的。使用变量必须先声明变量&#xff1a;int 变量的…

扫描路径_npj: 纳米团簇表面的自动扫描—吸附位点和扩散路径

海归学者发起的公益学术平台分享信息&#xff0c;整合资源交流学术&#xff0c;偶尔风月金属纳米团簇常用于催化&#xff0c;因具有较高的分散性&#xff0c;应用领域不断扩大。与较大的金属纳米颗粒相比&#xff0c;其固有活性通常要高出数倍。这种高出的催化活性主要归因于其…

pjsip的编译及简单使用

1.下载下载地址&#xff1a;http://www.pjsip.org/download.htm我下载的是pjproject-1.12.zip2.编译将下载的文件解压后&#xff0c;目录下有pjproject-vs8.sln&#xff0c;可以直接使用vs2005打开&#xff0c;目录下的readme.txt文件中有编译说明&#xff0c;关于windows下的注…

IOS之导航控制器与表视图

7.1 导航控制器 7.2 创建第一级控制器 7.3 第一个二级控制器 7.4 第一个三级控制器 7.5 第二个二级表控制器 7.6 第三个二级表控制器 7.7 第四个二级表控制器 7.8 第五个二级表视图控制器 7.8 第六个二级表视图控制器 7.1 导航控制器 关于导航控制器和表视图 导航控制器和表视图…

gin redis 链接不上_Redis 高并发问题,及解决方案!

&#xff08;一&#xff09;redis技术的使用&#xff1a;redis真的是一个很好的技术&#xff0c;它可以很好的在一定程度上解决网站一瞬间的并发量&#xff0c;例如商品抢购秒杀等活动。。。redis之所以能解决高并发的原因是它可以直接访问内存&#xff0c;而以往我们用的是数据…

任务管理平台_软件品质评测系统任务分发管理平台

testkuaibao|软件测试自学公众号1●为什么需要任务分发平台●在一个基本的评测系统中我们有了评测执行工具、评测数据、评测环境就能进行一次评测任务的执行&#xff0c;但现在是大数据时代&#xff0c;我们更多的需求是针对大量数据进行评测。比如在输入法评测中我们有10000个…

[转载]Visual Studio 2010敏捷利剑:详解Scrum

Visual Studio 2010敏捷利剑:详解Scrum 【IT168 专稿】随着微软Visual Studio 2010 Ultimate Beta2版本的发布&#xff0c;除了它提供协同一致的ALM(应用程序生命周期)管理工具外&#xff0c;MSF for Agile Software Development过程框架从4.2升级到5.0&#xff0c;并且是以Scr…

网站收录工具(php导航自动收录源码)_10步把企业网站优化做到极致,SEO优化的核心知识...

对于企业网站优化&#xff0c;重要的就3点&#xff0c;内容原创、外链建设、内部优化&#xff0c;其它网站优化也会涉及到这些&#xff0c;但是企业站就变的简单的多了&#xff0c;下面10步让你把企业网站优化做到极致。第一步&#xff1a;首先域就是让搜索引擎选择我们网站的主…

mysql not is null_转!!mysql 字段 is not null 和 字段 !=null

今天在查询数据时&#xff0c;查到包含一条某个时间startTime(该字段默认为null ) 为null的记录&#xff0c;想把它过滤&#xff0c;加了 startTime! null 的条件&#xff0c;结果记录都没了&#xff0c;应该用条件 is not null。转自&#xff1a;https://segmentfault.com/a/1…

myeclipse mysql连接_MyEclipse连接Mysql数据库的方法(一)

准备工作&#xff1a;MyEclipse使用的是2013版&#xff0c;mysql Ver 14.14 Distrib 5.6.281.jar包的下载(jdbc驱动)我下载的是&#xff1a;mysql-connector-java-5.1.7-bin.jar2.打开MyEclipse---->选择window---->选择open perspecctive---->myeclipse Database Exp…

c malloc 头文件_C/C++笔试题:主要考察C/C++语言基础概念算法及编程,附参考答案...

1.编写my_strcpy函数&#xff0c;实现与库函数strcpy类似的功能&#xff0c;不能使用任何库函数&#xff1b;答&#xff1a;char *strcpy(char *strDest, const char *strSrc){if ( strDest NULL || strSrc NULL)return NULL ;if ( strDest strSrc)returnstrDest ;char *tem…

SQLlite数据导入到mySQL_如何批量导入数据到Sqlite数据库

做android和ios开发的一般都用Sqlite数据库&#xff0c;有的时候数据需要批量导入&#xff0c;那么如何导入呢&#xff1f;在这里&#xff0c;介绍2种方法供大家参考。一、用sqlite命令以windows系统为例&#xff0c;linux下命令是一样的。1.安装sqlite工具包首先要安装有sqlit…