關(guān)于這個模式
在這個模式中在扰,我們將向你展示如何使用標(biāo)準(zhǔn)日歷計算與時間相關(guān)的計算课锌,如年初至今、去年同期和百分比增長膳汪。使用標(biāo)準(zhǔn)日歷的最大優(yōu)點是:你可以依賴多個內(nèi)置的時間智能函數(shù)。內(nèi)置函數(shù)的設(shè)計方式是為最常見的需求提供正確的結(jié)果九秀。
?如果內(nèi)置函數(shù)無法滿足你的需求遗嗽,或者你正在使用一個非標(biāo)準(zhǔn)的日歷,那么你應(yīng)該使用常規(guī)的(與時間無關(guān)的)DAX函數(shù)來達(dá)到相同的目標(biāo)颤霎。通過這種方式媳谁,你可以隨意定制代碼的結(jié)果涂滴。也就是說友酱,如果你需要自定義計算,那么還需要使用一組列來豐富你的日期表柔纵,這些列將被DAX公式用于移動篩選器缔杉。這些自定義計算將在自定義時間相關(guān)的計算模式中進(jìn)行介紹。
?如果你使用的是常規(guī)的公歷搁料,那么此模式中的公式是產(chǎn)生時間智能計算的最簡單和最有效的方法或详。請記住,標(biāo)準(zhǔn)的DAX時間智能函數(shù)只支持常規(guī)的公歷——即一年由12月組成郭计,每個月包含它的公歷天數(shù)(28~31天)霸琴,三個月組成一個季度,以及我們所習(xí)慣的日歷的所有常規(guī)方面昭伸。
介紹時間智能計算
為了使用任何時間智能計算梧乘,你需要一個格式良好的日期表。日期表必須滿足以下要求:
- 包含所需年份的所有日期庐杨。日期表必須從1月1日開始选调,到12月31日結(jié)束,并包含這個范圍內(nèi)的所有天數(shù)灵份。如果報告只引用財年仁堪,那么日期表必須包括從財年的第一天到最后一天的所有日期。例如:如果2008財年從2007年7月1日開始填渠,那么日期表必須包含從2007年7月1日到2008年6月30日的所有天數(shù)弦聂。
- 需要有一個具有DateTime 或Date 數(shù)據(jù)類型并且包含唯一值的列鸟辅。通常這一列命名為Date。雖然Date 列經(jīng)常被用于定義與其他表之間的關(guān)系莺葫,但這不是必需的剔桨。盡管如此,Date 列必須包含唯一的值徙融,并且應(yīng)該由“標(biāo)記為日期表”特性引用洒缀。如果該列還包含時間部分,則不應(yīng)該使用時間——例如欺冀,時間應(yīng)該始終是12:00 am树绩。
- Date 表必須在模型中標(biāo)記為日期表,以防Date 表和其他表之間的關(guān)系(例如示例中的Sales 表)不是基于日期列隐轩。
?有幾種不同方法可以構(gòu)建Date 表饺饭。只要日期表滿足以上要求,構(gòu)建Date 表的方式并不影響使用標(biāo)準(zhǔn)時間智能計算的方式职车。如果你已經(jīng)有一個適用于你的報告的Date 表瘫俊,只需導(dǎo)入它并在檢查它滿足最低要求之后將其標(biāo)記為日期表。如果你沒有Date 表悴灵,可以使用稍后描述的DAX計算表創(chuàng)建一個扛芽。
?最佳實踐是: 將用于時間智能計算的Date 表標(biāo)記為日期表。每次在Date 列上應(yīng)用一個篩選器時积瞒,"標(biāo)記為日期表"設(shè)置都會對日期表自動添加REMOVEFILTERS川尖。這個操作(在Date列上應(yīng)用一個篩選器)是由作為CALCULATE的篩選參數(shù)的時間智能函數(shù)執(zhí)行。如果你使用Date 列定義了Sales 和Date 之間的關(guān)系茫孔,DAX會表現(xiàn)出相同的行為叮喳。盡管如此,將"標(biāo)記為日期表"設(shè)置應(yīng)用于日期表是一個最佳實踐缰贝。如果你有多個日期表馍悟,你可以將所有日期表標(biāo)記為日期表。
?如果沒有使用"標(biāo)記為日期表"設(shè)置并且沒有使用日期列定義關(guān)系剩晴,那么每當(dāng)在CALCULATE中使用時間智能函數(shù)時锣咒,都必須對日期表添加REMOVEFILTERS。關(guān)于這個行為的更多細(xì)節(jié)請瀏覽Power BI Desktop中的時間智能李破。
什么是標(biāo)準(zhǔn)的DAX時間智能函數(shù)?
標(biāo)準(zhǔn)的時間智能函數(shù)是表函數(shù)宠哄,它返回一列用于作為CALCULATE的篩選參數(shù)的日期值∴凸ィ可以通過編寫一個比較復(fù)雜的篩選表達(dá)式來獲得和時間智能函數(shù)相同的結(jié)果毛嫉。例如,DATESYTD 函數(shù)返回從同一年中的第一天到當(dāng)前篩選上下文中可見的最后一天之間的所有日期妇菱。
DATESYTD ( 'Date'[Date] )
?等同于下面的FILTER表達(dá)式:
VAR LastDateAvailable = MAX ( 'Date'[Date] )
VAR FirstJanuaryOfLastDate = DATE ( YEAR ( LastDateAvailable ), 1, 1 )
RETURN
FILTER (
ALL ( 'Date'[Date] ),
AND (
'Date'[Date] >= FirstJanuaryOfLastDate,
'Date'[Date] <= LastDateAvailable
)
)
?有很多時間智能函數(shù)承粤,我們將在這個模式中呈現(xiàn)它們中的大部分暴区。請注意:時間智能函數(shù)應(yīng)該作為CALCULATE的篩選參數(shù),并且有時你將借助變量來實現(xiàn)這一點辛臊。在迭代函數(shù)中使用時間智能函數(shù)是危險的仙粱,因為會觸發(fā)隱式的上下文轉(zhuǎn)換, 并且從轉(zhuǎn)換而來的篩選上下文中檢索可見的日期。關(guān)于這個行為的更多細(xì)節(jié)請瀏覽DAX Guide文檔: https://dax.guide/datesytd/彻舰。
?以下是使用時間智能函數(shù)的最佳實踐的快速指南:
- 僅在CALCULATE / CALCULATETABLE的篩選器參數(shù)中使用像DATESYTD這樣的時間智能函數(shù)伐割,或者使用時間智能函數(shù)將篩選器分配于變量。
- 在返回值的DAX表達(dá)式中使用標(biāo)量函數(shù)—也稱為標(biāo)量表達(dá)式刃唤,如EDATE和EOMONTH隔心。這些函數(shù)不是時間智能函數(shù),可以在行上下文中計值的表達(dá)式中使用尚胞。
- 使用CONVERT將日期轉(zhuǎn)換為數(shù)字硬霍,反之亦然。
- 請瀏覽https://dax.guide/獲得有關(guān)時間智能函數(shù)的最新完整清單笼裳。
?DAX初學(xué)者經(jīng)澄簦混淆時間智能函數(shù)和正則標(biāo)量時間函數(shù)。這種混淆會導(dǎo)致一些常見的錯誤躬柬,可以通過遵循以下建議來避免:
- 不要使用DATEADD返回前一天或第二天拜轨,你可以使用簡單的數(shù)學(xué)運(yùn)算符實現(xiàn)。
- 不要在標(biāo)量表達(dá)式中使用PREVIOUSDAY計算前一天楔脯。你只需從日期上減去一天撩轰,就可以在標(biāo)量表達(dá)式中獲取前一天。
- 不要使用EOMONTH作為篩選器參數(shù)昧廷,而要使用ENDOFMONTH 。EOMONTH是一個標(biāo)量表達(dá)式偎箫。ENDOFMONTH是一個時間智能函數(shù)木柬。始終要注意函數(shù)的返回類型:只有表函數(shù)是時間智能函數(shù),并且不應(yīng)該在標(biāo)量表達(dá)式中使用時間智能函數(shù)淹办。
禁用自動日期/時間
Power BI自動為模型中的每個日期或日期時間類型的列創(chuàng)建一個日期表眉枕。然而, 我們
我們強(qiáng)烈建議禁用Power BI自動創(chuàng)建的日期表,并取而代之怜森,導(dǎo)入或創(chuàng)建一個顯式的日期表速挑。關(guān)于這一建議的更多細(xì)節(jié)請瀏覽文章Automatic time intelligence in Power BI。
?自動日期表的存在還啟用了一種被稱為列變體的特殊語法副硅。它表現(xiàn)為: 在日期列后有一個點姥宝,后面再跟著一個自動創(chuàng)建的日期表中的列。
Sales[Order Date].[Date]
?當(dāng)對一個自動日期表使用Power BI快速度量值時, Power BI快速度量值大量使用了列變體恐疲。我們不依賴于在Power BI中自動創(chuàng)建的日期表腊满,因為我們希望對模型保持最大的靈活性和最大的控制套么。列變體的語法不支持作為模型一部分的日期表,因此碳蛋,也不能自動創(chuàng)建胚泌。
標(biāo)準(zhǔn)時間智能函數(shù)的局限性
標(biāo)準(zhǔn)時間智能函數(shù)適用于常規(guī)的公歷。在本章節(jié)中列出了它們的幾個限制肃弟。當(dāng)你的需求和這些限制不兼容時玷室,你需要另外的模式(請參閱 Custom time-related calculations 和 Week-related calculations)。
- 年從1月1日開始笤受。對于從一個不同日期開始的財年日歷的支持有限阵苇。而且,每個財年的第一天必須是同一天并且由于與閏年有關(guān)的歷史bug不能是3月1日感论。
- 季度總是在1月绅项、4月、7月和10月的第一天開始比肄。一個季度的日期范圍不能被修改快耿。
- 月總是一個日歷月
- 標(biāo)準(zhǔn)時間智能函數(shù)可能無法正確地篩選附加列,例如Day of Week或Working Day芳绩。關(guān)于可能的解決方案的更多細(xì)節(jié)掀亥,將在本章后面的"篩選其他日期屬性"中介紹。
?因此妥色,標(biāo)準(zhǔn)時間智能計算不支持許多高級計算搪花,比如對于周的計算。這些高級計算需要自定義日歷嘹害。
DAX Patterns, Second Edition | 中文翻譯撮竿,持續(xù)更新...
DAX Patterns, Second Edition by ALBERTO FERRARI, MARCO RUSSO
搜索微信公眾號:PowerBI最佳實踐, 獲取案例文件和更多Power BI/DAX精彩好文
DAX Patterns | 關(guān)于時間的標(biāo)準(zhǔn)計算 (qq.com)
DAX Patterns | 關(guān)于時間的標(biāo)準(zhǔn)計算 - 知乎 (zhihu.com)