關(guān)于這個(gè)模式在這個(gè)模式中,我們將向你展示如何使用標(biāo)準(zhǔn)日歷計(jì)算與時(shí)間相關(guān)的計(jì)算,如年初至今、去年同期和百分比增長(zhǎng)。使用標(biāo)準(zhǔn)日歷的最大優(yōu)點(diǎn)是:你可以依賴多個(gè)內(nèi)置的時(shí)間智能函數(shù)。內(nèi)置函數(shù)的設(shè)計(jì)方式是為最常見(jiàn)的需求提供正確的結(jié)果。 ?如果內(nèi)置函數(shù)無(wú)法滿足你的需求,或者你正在使用一個(gè)非標(biāo)準(zhǔn)的日歷,那么你應(yīng)該使用常規(guī)的(與時(shí)間無(wú)關(guān)的)DAX函數(shù)來(lái)達(dá)到相同的目標(biāo)。通過(guò)這種方式,你可以隨意定制代碼的結(jié)果。也就是說(shuō),如果你需要自定義計(jì)算,那么還需要使用一組列來(lái)豐富你的日期表,這些列將被DAX公式用于移動(dòng)篩選器。這些自定義計(jì)算將在自定義時(shí)間相關(guān)的計(jì)算模式中進(jìn)行介紹。 ?如果你使用的是常規(guī)的公歷,那么此模式中的公式是產(chǎn)生時(shí)間智能計(jì)算的最簡(jiǎn)單和最有效的方法。請(qǐng)記住,標(biāo)準(zhǔn)的DAX時(shí)間智能函數(shù)只支持常規(guī)的公歷——即一年由12月組成,每個(gè)月包含它的公歷天數(shù)(28~31天),三個(gè)月組成一個(gè)季度,以及我們所習(xí)慣的日歷的所有常規(guī)方面。 介紹時(shí)間智能計(jì)算為了使用任何時(shí)間智能計(jì)算,你需要一個(gè)格式良好的日期表。日期表必須滿足以下要求: 包含所需年份的所有日期。日期表必須從1月1日開(kāi)始,到12月31日結(jié)束,并包含這個(gè)范圍內(nèi)的所有天數(shù)。如果報(bào)告只引用財(cái)年,那么日期表必須包括從財(cái)年的第一天到最后一天的所有日期。例如:如果2008財(cái)年從2007年7月1日開(kāi)始,那么日期表必須包含從2007年7月1日到2008年6月30日的所有天數(shù)。 需要有一個(gè)具有DateTime 或Date 數(shù)據(jù)類型并且包含唯一值的列。通常這一列命名為Date。雖然Date 列經(jīng)常被用于定義與其他表之間的關(guān)系,但這不是必需的。盡管如此,Date 列必須包含唯一的值,并且應(yīng)該由“標(biāo)記為日期表”特性引用。如果該列還包含時(shí)間部分,則不應(yīng)該使用時(shí)間——例如,時(shí)間應(yīng)該始終是12:00 am。 Date 表必須在模型中標(biāo)記為日期表,以防Date 表和其他表之間的關(guān)系(例如示例中的Sales 表)不是基于日期列。
?有幾種不同方法可以構(gòu)建Date 表。只要日期表滿足以上要求,構(gòu)建Date 表的方式并不影響使用標(biāo)準(zhǔn)時(shí)間智能計(jì)算的方式。如果你已經(jīng)有一個(gè)適用于你的報(bào)告的Date 表,只需導(dǎo)入它并在檢查它滿足最低要求之后將其標(biāo)記為日期表。如果你沒(méi)有Date 表,可以使用稍后描述的DAX計(jì)算表創(chuàng)建一個(gè)。 ?最佳實(shí)踐是: 將用于時(shí)間智能計(jì)算的Date 表標(biāo)記為日期表。每次在Date 列上應(yīng)用一個(gè)篩選器時(shí),'標(biāo)記為日期表'設(shè)置都會(huì)對(duì)日期表自動(dòng)添加REMOVEFILTERS。這個(gè)操作(在Date列上應(yīng)用一個(gè)篩選器)是由作為CALCULATE的篩選參數(shù)的時(shí)間智能函數(shù)執(zhí)行。如果你使用Date 列定義了Sales 和Date 之間的關(guān)系,DAX會(huì)表現(xiàn)出相同的行為。盡管如此,將'標(biāo)記為日期表'設(shè)置應(yīng)用于日期表是一個(gè)最佳實(shí)踐。如果你有多個(gè)日期表,你可以將所有日期表標(biāo)記為日期表。 ?如果沒(méi)有使用'標(biāo)記為日期表'設(shè)置并且沒(méi)有使用日期列定義關(guān)系,那么每當(dāng)在CALCULATE中使用時(shí)間智能函數(shù)時(shí),都必須對(duì)日期表添加REMOVEFILTERS。關(guān)于這個(gè)行為的更多細(xì)節(jié)請(qǐng)瀏覽Power BI Desktop中的時(shí)間智能。 什么是標(biāo)準(zhǔn)的DAX時(shí)間智能函數(shù)?標(biāo)準(zhǔn)的時(shí)間智能函數(shù)是表函數(shù),它返回一列用于作為CALCULATE的篩選參數(shù)的日期值??梢酝ㄟ^(guò)編寫一個(gè)比較復(fù)雜的篩選表達(dá)式來(lái)獲得和時(shí)間智能函數(shù)相同的結(jié)果。例如,DATESYTD 函數(shù)返回從同一年中的第一天到當(dāng)前篩選上下文中可見(jiàn)的最后一天之間的所有日期。 ?等同于下面的FILTER表達(dá)式:
?有很多時(shí)間智能函數(shù),我們將在這個(gè)模式中呈現(xiàn)它們中的大部分。請(qǐng)注意:時(shí)間智能函數(shù)應(yīng)該作為CALCULATE的篩選參數(shù),并且有時(shí)你將借助變量來(lái)實(shí)現(xiàn)這一點(diǎn)。在迭代函數(shù)中使用時(shí)間智能函數(shù)是危險(xiǎn)的,因?yàn)闀?huì)觸發(fā)隱式的上下文轉(zhuǎn)換, 并且從轉(zhuǎn)換而來(lái)的篩選上下文中檢索可見(jiàn)的日期。關(guān)于這個(gè)行為的更多細(xì)節(jié)請(qǐng)瀏覽DAX Guide文檔: https://ide/datesytd/。 ?以下是使用時(shí)間智能函數(shù)的最佳實(shí)踐的快速指南: 僅在CALCULATE / CALCULATETABLE的篩選器參數(shù)中使用像DATESYTD這樣的時(shí)間智能函數(shù),或者使用時(shí)間智能函數(shù)將篩選器分配于變量。 在返回值的DAX表達(dá)式中使用標(biāo)量函數(shù)—也稱為標(biāo)量表達(dá)式,如EDATE和EOMONTH。這些函數(shù)不是時(shí)間智能函數(shù),可以在行上下文中計(jì)值的表達(dá)式中使用。 使用CONVERT將日期轉(zhuǎn)換為數(shù)字,反之亦然。 請(qǐng)瀏覽https://ide/獲得有關(guān)時(shí)間智能函數(shù)的最新完整清單。
?DAX初學(xué)者經(jīng)?;煜龝r(shí)間智能函數(shù)和正則標(biāo)量時(shí)間函數(shù)。這種混淆會(huì)導(dǎo)致一些常見(jiàn)的錯(cuò)誤,可以通過(guò)遵循以下建議來(lái)避免: 不要使用DATEADD返回前一天或第二天,你可以使用簡(jiǎn)單的數(shù)學(xué)運(yùn)算符實(shí)現(xiàn)。 不要在標(biāo)量表達(dá)式中使用PREVIOUSDAY計(jì)算前一天。你只需從日期上減去一天,就可以在標(biāo)量表達(dá)式中獲取前一天。 不要使用EOMONTH作為篩選器參數(shù),而要使用ENDOFMONTH 。EOMONTH是一個(gè)標(biāo)量表達(dá)式。ENDOFMONTH是一個(gè)時(shí)間智能函數(shù)。始終要注意函數(shù)的返回類型:只有表函數(shù)是時(shí)間智能函數(shù),并且不應(yīng)該在標(biāo)量表達(dá)式中使用時(shí)間智能函數(shù)。
禁用自動(dòng)日期/時(shí)間Power BI自動(dòng)為模型中的每個(gè)日期或日期時(shí)間類型的列創(chuàng)建一個(gè)日期表。然而, 我們 我們強(qiáng)烈建議禁用Power BI自動(dòng)創(chuàng)建的日期表,并取而代之,導(dǎo)入或創(chuàng)建一個(gè)顯式的日期表。關(guān)于這一建議的更多細(xì)節(jié)請(qǐng)瀏覽文章Automatic time intelligence in Power BI。 ?自動(dòng)日期表的存在還啟用了一種被稱為列變體的特殊語(yǔ)法。它表現(xiàn)為: 在日期列后有一個(gè)點(diǎn),后面再跟著一個(gè)自動(dòng)創(chuàng)建的日期表中的列。 ?當(dāng)對(duì)一個(gè)自動(dòng)日期表使用Power BI快速度量值時(shí), Power BI快速度量值大量使用了列變體。我們不依賴于在Power BI中自動(dòng)創(chuàng)建的日期表,因?yàn)槲覀兿M麑?duì)模型保持最大的靈活性和最大的控制。列變體的語(yǔ)法不支持作為模型一部分的日期表,因此,也不能自動(dòng)創(chuàng)建。 標(biāo)準(zhǔn)時(shí)間智能函數(shù)的局限性標(biāo)準(zhǔn)時(shí)間智能函數(shù)適用于常規(guī)的公歷。在本章節(jié)中列出了它們的幾個(gè)限制。當(dāng)你的需求和這些限制不兼容時(shí),你需要另外的模式(請(qǐng)參閱 Custom time-related calculations 和 Week-related calculations)。 年從1月1日開(kāi)始。對(duì)于從一個(gè)不同日期開(kāi)始的財(cái)年日歷的支持有限。而且,每個(gè)財(cái)年的第一天必須是同一天并且由于與閏年有關(guān)的歷史bug不能是3月1日。 季度總是在1月、4月、7月和10月的第一天開(kāi)始。一個(gè)季度的日期范圍不能被修改。 月總是一個(gè)日歷月 標(biāo)準(zhǔn)時(shí)間智能函數(shù)可能無(wú)法正確地篩選附加列,例如Day of Week或Working Day。關(guān)于可能的解決方案的更多細(xì)節(jié),將在本章后面的'篩選其他日期屬性'中介紹。
?因此,標(biāo)準(zhǔn)時(shí)間智能計(jì)算不支持許多高級(jí)計(jì)算,比如對(duì)于周的計(jì)算。這些高級(jí)計(jì)算需要自定義日歷。
|