白茶在很久之前,寫過關於笛卡爾積的兩個函式。
generate函式與crossjoin函式。
傳送門:《笛卡爾積》
那麼這兩個函式之間具體的區別是什麼呢?在實際用途中的區別呢?
本期白茶來解釋一下二者之間的核心點:上下文傳遞問題。
在微軟的官方介紹中並未提及兩個函式的區別。
但是從語法上看generate引數只能是兩個,crossjoin引數可以是多個。
但是實際使用上,二者還有乙個核心的關鍵點,就是generate函式可以傳遞第一引數的上下文,而crossjoin函式不能傳遞第一引數上下文。
白茶將通過一組案例資料進行說明:
這是白茶隨機模擬的資料,將其匯入到powerbi中,建立日期表以及模型關係如下:
編寫如下度量值:
genrate =
generate (
,summarize (
'銷售明細',
'銷售明細'[商品名稱],
"index", switch ( [value], "當月", 1, "當季", 2, "當年", 3 ),
"資料",
switch (
[value],
"當月", totalmtd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] ),
"當季", totalqtd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] ),
"當年", totalytd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] )))
)
結果如下:
這段**是什麼意思呢?
1.首先是利用輸入模式,直接輸入了三個時間粒度的標識字段作為第一引數;
2.然後利用summarize函式生成乙個表,新增了「資料列」和「索引列」;
3.summarize函式利用generate函式傳遞第一引數上下文的功能,根據條件判定進行計算。
這樣的話就對「商品名稱」這一列進行了不同時間粒度的彙總。
動態效果如下:
根據切片器的選擇,可以在表中呈現不同時間粒度彙總的結果。
那麼別忘了,還有crossjoin函式呢。
輸入如下**:
crossjoin =
crossjoin (
,summarize (
'銷售明細',
'銷售明細'[商品名稱],
"index", switch ( [value], "當月", 1, "當季", 2, "當年", 3 ),
"資料",
switch (
[value],
"當月", totalmtd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] ),
"當季", totalqtd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] ),
"當年", totalytd ( sum ( '銷售明細'[銷售數量] ), 'date'[date] )))
)
與上面的**對比,二者除了使用函式區別外,沒有任何區別。
結果如下:
結果無法得出,白茶第一次遇到這個問題的時候,思考了很久,感覺即在意料之外,也在情理之中。
首先是generate這個函式本身只有兩個引數,那麼進行上下文傳遞的時候,可以說已經被劃定範圍了,這樣的話雖然**計算的速度慢,但是會有結果。
而crossjoin函式可以有多個引數,如果內部允許上下文傳遞的話,從一參,到二參,到三參等等,會導致迭代的速度變得巨卡無比,甚至無法得出結果。
可以說從效能的角度考慮,微軟在設計crossjoin函式的時候,就已經考慮到這個問題了,因此其不具備內部上下文傳遞的功能。
小夥伴們❤get了麼?
白茶會不定期的分享一些函式卡片
(檔案在知識星球[powerbi丨需求圈])
這裡是白茶,乙個powerbi的初學者。
銷售需求丨切換技巧
小a 白茶兄!白茶兄!在不在?救命啊,兄弟!白茶 一臉迷茫 啊?小a 是這樣的,我遇到了乙個需求問題!某位老闆,想自由切換top3!白茶 額,這個我不是教過你麼?top3通過allselected函式可以實現啊!小a 不是這樣的,這個老闆是個完美主義者!要的是不同維度的top3,並且只能顯示乙個,比...
CSS樣式切換技巧
樣式與資料分離所帶來的不只是符合標準這樣的簡單,樣式既然與資料分離那麼樣式的切換則變得理所當然的了!但是網上這樣的中文教程實在是太少了!所以我收集了一部分中外 已經實現的技術資料整理出來供參考。首先要具備不同內容的 css檔案 最好每個檔案代表一種樣式,或是代表需要作出變動的部分 這裡以三個為例 第...
BI商業智慧型,想說愛你不容易丨科技雲 視角
在大資料概念 氾濫 的今天,bi對於企業的價值越來越明顯,然而大部分的企業還在這條路上探索。bi是英文business intelligence的縮寫,即商業智慧型。商業智慧型一詞最早是由國際知名的it諮詢機構gartner在1996年提出的,指的是用資料倉儲技術 聯機分析處理 資料探勘和資料展現技...