其他時間智慧計算
有其他 DAX 時間智慧函式存在,涉及到傳回單一日期。 您會在兩個不同的案例中套用這些函式,藉此深入了解這些函式。
FIRSTDATE
與 LASTDATE
DAX 函式會針對指定的日期資料行,傳回目前篩選內容中的第一個和最後一個日期。
計算新的發生次數
時間智慧函式的另一種用法是計算新的發生次數。 以下範例示範如何計算一段時間內的新客戶數目。 新客戶會在計入到首次購買的時間週期。
首先要在 Sales 資料表中新增下列量值,以計算「開始使用至今」(LTD) 不同客戶的數目。 開始使用至今是表示從時間開始到篩選內容中的最後一個日期為止。 請使用千位分隔符,將量值的格式設為整數。
Customers LTD =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD
將 Customers LTD 量值新增至矩陣視覺效果。 請注意,這會產生「開始使用至今不同客戶」的結果,直到每個月結束為止。
DATESBETWEEN
函式會傳回包含日期資料行的資料表,該資料行從指定的開始日期開始,直到指定的結束日期為止。 當開始日期為空白時,會使用日期資料行中的第一個日期。 (相反地,當結束日期為空白時,會使用日期資料行中的最後一個日期)。在此情況下,結束日期是由 MAX 函式決定,此函式會傳回篩選內容中的最後一個日期。 因此,如果篩選內容是 2017 年 8 月,則 MAX 函式會傳回 2017 年 8 月 31 日,而 DATESBETWEEN
函式會傳回截至 2017 年 8 月 31 日為止的所有日期。
接著,您將修改量值,方法是將其重新命名為 [新客戶],並新增第二個變數來儲存在篩選內容的時間週期之前的不同客戶計數。
RETURN
子句現在會從開始使用至今的客戶減去此值,以產生結果,這是時間週期內的新客戶數目。
New Customers =
VAR CustomersLTD =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MAX('Date'[Date])
),
'Sales Order'[Channel] = "Internet"
)
VAR CustomersPrior =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerKey]),
DATESBETWEEN(
'Date'[Date],
BLANK(),
MIN('Date'[Date]) - 1
),
'Sales Order'[Channel] = "Internet"
)
RETURN
CustomersLTD - CustomersPrior
對於 CustomersPrior 變數,請注意,DATESBETWEEN
函式包含的日期是到篩選內容中第一個日期減一為止。 由於 Microsoft Power BI 會在內部將日期儲存為數字,因此,您可以加減數字來移位日期。
快照集計算
有時候,事實資料會及時儲存為快照集。 常見範例包括庫存層級或帳戶餘額。 值的快照集會定期載入資料表。
彙總快照集值 (例如庫存層級) 時,您可以在任何維度 (日期除外) 中彙總值。 在產品類別目錄中新增庫存層級計數,會產生有意義的摘要;但若是新增不同日期的庫存層級計數,並不會產生有意義的摘要。 將昨日庫存層級新增至今日的庫存層級,並非有用的執行作業 (除非想要計算出該結果的平均)。
當您彙總快照集資料表時,量值公式可以依賴 DAX 時間智慧函式來強制執行單一日期篩選條件。
在下列範例中,您將探索 Adventure Works 公司的案例。 切換至模型檢視,然後選取 Inventory 模型圖表。
請注意,圖表顯示了三個資料表:產品、日期和庫存。 庫存資料表會儲存每個日期和產品的單位餘額快照集。 重要的是,該資料表不會遺漏任何日期,也不會在相同日期出現任何產品的重複項目。 此外,最後一個快照集記錄的儲存日期為 2020 年 6 月 15 日。
現在,切換到報表檢視,然後選取報表的 [第 2 頁]。 將庫存資料表的 UnitsBalance 資料行新增至矩陣視覺效果。 其預設摘要設為總和值。
此視覺化設定是如何不將快照集值匯總的範例。 將每日快照集餘額相加不會產生有意義的結果。 因此,請將 [UnitsBalance] 欄位從矩陣視覺效果中移除。
現在,您將新增一個量值到 Inventory 資料表,以針對單一日期加總 UnitsBalance 值。 日期會是每個時間週期的最後一個日期。 您可以使用 LASTDATE
函式來完成此作業。 請使用千位分隔符,將量值的格式設為整數。
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTDATE('Date'[Date])
)
注意
請注意,量值公式會使用 SUM
函式。 必須使用彙總函式 (量值不允許直接參考資料行),但是有鑒於每個日期的每項產品只有一個資料列,SUM
函式只會在單一資料列上作業。
將 Stock on Hand 量值新增至矩陣視覺效果。 每個產品的值現在是以每個月最後記錄的單位餘額為準。
此量值會針對 2020 年 6 月傳回空白,因為六月的最後一天沒有記錄。 根據資料顯示,這情況尚未發生。
依篩選內容中的最後一個日期篩選,此方法本身存在一些問題:記錄的日期可能會因為尚未發生而不存在,或者可能因為週末不記錄庫存餘額而不存在。
下一個步驟是調整量值公式,以判斷具有非空白結果的日期,然後依該日期篩選。 您可以藉由使用 LASTNONBLANK
DAX 函式來達成這項工作。
使用下列量值定義來修改 Stock on Hand 量值。
Stock on Hand =
CALCULATE(
SUM(Inventory[UnitsBalance]),
LASTNONBLANK(
'Date'[Date],
CALCULATE(SUM(Inventory[UnitsBalance]))
)
)
在矩陣視覺效果中,請注意 [2020 年 6 月] 和 [總計] (代表整個年度) 的值。
LASTNONBLANK
函式是迭代器函式。 會傳回產生非空白結果的最後一個日期。 其會依遞減的時間順序逐一查看篩選內容中的所有日期,藉此達到此結果。 (相反地,FIRSTNONBLANK
會依遞增的時間順序逐一查看。)其會對每個日期評估傳入的運算式。 當遇到非空白的結果時,函式會傳回日期。 然後,該日期會用來篩選 CALCULATE
函式。
注意
LASTNONBLANK
函式會評估其在資料列內容中的運算式。 必須使用 CALCULATE
函式將資料列內容轉換為篩選內容,才能正確評估運算式。
現在請隱藏 Inventory 資料表的 UnitsBalance 資料行。 如此可避免報表作者不當匯總快照集單位餘額。