中天数相减获得差_Power BI 了解DAX中LASTDATE和MAX之间的区别
許多剛開始使用DAX的小伙伴在使用LASTDATE搜索某個(gè)時(shí)間段內(nèi)的最后日期。或者他們使用NEXTDAY檢索給定日期之后的日期。盡管這些函數(shù)可以實(shí)現(xiàn)它們所承諾的功能,但它們并不打算在簡(jiǎn)單的表達(dá)式中使用。相反,它們是設(shè)計(jì)用于時(shí)間智能計(jì)算的表函數(shù)。錯(cuò)誤地使用它們會(huì)導(dǎo)致代碼效率低下。此外,以未設(shè)計(jì)的方式使用這些功能是一個(gè)明顯的信號(hào),表明開發(fā)人員仍未掌握DAX的某些細(xì)節(jié)。
在本文中,我們將詳細(xì)介紹該主題,以便了解這些時(shí)間智能功能的作用。我們還想了解在日期上將它們與簡(jiǎn)單的數(shù)學(xué)混淆如此容易的原因。我們想通過例子來詳細(xì)闡述這個(gè)話題。因此,我們從無聊的理論開始,而不是從一個(gè)計(jì)算開始,盡管這種計(jì)算工作得很好,但它本質(zhì)上是錯(cuò)誤的。
計(jì)算給定選擇中包含的天數(shù),并生成如下所示的報(bào)告。
計(jì)算DaysInPeriod很簡(jiǎn)單:天數(shù)是時(shí)間段中第一個(gè)日期和最后一個(gè)日期之間的差。DAX提供了兩個(gè)功能:FIRSTDATE和LASTDATE,這似乎是完美的候選者:
Days in period :=INT ( LASTDATE ( 'Date'[Date] ) - FIRSTDATE ( 'Date'[Date] ) )這項(xiàng)措施可以正常工作并產(chǎn)生正確的結(jié)果。因此,我們很高興!對(duì)?錯(cuò)誤。我們不滿意,因?yàn)槲覀兪褂肔ASTDATE來檢索一個(gè)時(shí)間段內(nèi)最后一個(gè)可見日期的值。LASTDATE完全執(zhí)行此作業(yè),但它返回一個(gè)包含最后日期的表-不僅是日期。讓我重復(fù)一遍:它不返回日期。它返回一個(gè)包含日期的表。
這樣做的原因是LASTDATE是時(shí)間智能功能。其主要目的是用作CALCULATE中的過濾器參數(shù)。CALCULATE過濾器參數(shù)是表。因此,要使函數(shù)在以下度量中使用,它需要返回一個(gè)表:
SalesOfLastDay =CALCULATE ( [Sales Amount], LASTDATE ( 'Date'[Date] ))您可以使用DAX Studio 再次檢查L(zhǎng)ASTDATE的結(jié)果。LASTDATE返回一個(gè)表。這就是為什么您可以在EVALUATE語句中使用它的原因,該語句需要一個(gè)表作為結(jié)果。
如您所見,結(jié)果是一個(gè)表,其中包含一列(Date)和最后一個(gè)日期的值。
在DAX中,可以使用僅包含一行和一列的表(即您從LASTDATE獲得的結(jié)果)代替內(nèi)部的值。實(shí)際上,單行一列的表僅包含一個(gè)值。這就是DAX允許您將表自動(dòng)轉(zhuǎn)換為值的原因。這也是您可以在我們的度量中減去兩個(gè)表的原因:
Days in period :=INT ( LASTDATE ( 'Date'[Date] ) - FIRSTDATE ( 'Date'[Date] ) )實(shí)際上,LASTDATE和FIRSTDATE都返回表。因?yàn)槲覀兪褂玫氖菧p法運(yùn)算符,所以DAX會(huì)將兩個(gè)表轉(zhuǎn)換為標(biāo)量值,然后計(jì)算表內(nèi)包含的值之間的差。
盡管此行為是透明的,但它是有代價(jià)的。表示先前計(jì)算的一種更好的方法是使用標(biāo)量函數(shù),例如MIN而不是FIRSTDATE和MAX而不是LASTDATE。MIN和MAX不返回表:它們返回第一個(gè)和最后一個(gè)日期的值。因此,以下是對(duì)措施的更好表述:
Days in period MIN MAX :=INT ( MAX ( 'Date'[Date] ) - MIN ( 'Date'[Date] ) )同樣,您可以使用DAX Studio 再次檢查MIN和MAX的結(jié)果。如果您嘗試使用MAX而不是LASTDATE作為EVALUATE語句的結(jié)果,則會(huì)出現(xiàn)錯(cuò)誤。
為了獲得EVALUATE的結(jié)果,您需要構(gòu)建一個(gè)包含最大日期的表。例如,您可以使用表構(gòu)造函數(shù)執(zhí)行此操作。
如前所述,DAX自動(dòng)將具有一行和一列的表轉(zhuǎn)換為值。但是這種行為是有代價(jià)的。此外,LASTDATE和FIRSTDATE都在查找第一個(gè)和最后一個(gè)日期之前執(zhí)行上下文轉(zhuǎn)換。此行為不會(huì)影響我們的簡(jiǎn)單示例,但是僅由于此方面,在更復(fù)雜的情況下性能可能會(huì)很差。
本文是DAX 101;因此,它應(yīng)該在這里結(jié)束。但是,當(dāng)然,我們不禁為您中最好奇的人提供更多詳細(xì)信息。您如何檢查公式的兩個(gè)版本之間的行為差異?
通過使用DAX Studio,您可以分析此查詢的服務(wù)器時(shí)間:
---- This version uses FIRSTDATE and LASTDATE--EVALUATESUMMARIZECOLUMNS ( 'Date'[Year Month], "Daysin period", [Days in period])盡管速度非常快,但是可以從服務(wù)器計(jì)時(shí)中看到引擎必須兩次實(shí)現(xiàn)Date表:一次用于Date [Date]列,一次用于兩列Date [Date]和Date [Calendar Year Month],生成兩個(gè)具有2,556行的數(shù)據(jù)緩存。公式引擎(FE)隨后掃描這些數(shù)據(jù)緩存以計(jì)算所需的結(jié)果。
通過這種簡(jiǎn)單的計(jì)算,當(dāng)查詢使用優(yōu)化版本MIN MAX內(nèi)的天數(shù)?時(shí),查詢不會(huì)更快。仍然,在實(shí)現(xiàn)方面要好得多,因?yàn)閷⒄麄€(gè)計(jì)算下推到存儲(chǔ)引擎(SE),該引擎將生成具有87行的單個(gè)數(shù)據(jù)緩存:與查詢結(jié)果相同的行數(shù)。因此,期間MIN MAX中的天數(shù)將通過SE執(zhí)行的完整計(jì)算產(chǎn)生最佳實(shí)現(xiàn)。在較大的模型或更復(fù)雜的場(chǎng)景中,實(shí)現(xiàn)上的這種微小差異可能會(huì)產(chǎn)生巨大的影響。
請(qǐng)注意,大多數(shù)時(shí)間智能功能(例如FIRSTDATE,LASTDATE,NEXTDAY,PREVIOUSDAY …)都顯示相同的行為:它們返回一個(gè)可以自動(dòng)轉(zhuǎn)換為標(biāo)量值的表。但是轉(zhuǎn)換的代價(jià)是不值得付出的。
了解函數(shù)的一些本質(zhì)也是變相的改善報(bào)告的性能,就也是為什么我在之前的文章中一再強(qiáng)調(diào)某些函數(shù)是如何運(yùn)算,可能很多小伙伴只注重結(jié)果正確而忽略了一些細(xì)節(jié)。
總結(jié)
以上是生活随笔為你收集整理的中天数相减获得差_Power BI 了解DAX中LASTDATE和MAX之间的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离职用原单位申请信用卡会批卡吗
- 下一篇: cdh界面 hue 配置hbase_海量