[英]DAX: Unwanted cartesian product lines?
請幫助正確計算/理解以下簡化示例的lastDate
和rankDate
度量( 下載):
期望的結果:
現實(不正確的子類型):
為什么關系破裂?
如何避免這條笛卡爾積線?
我的措施(我評論了解決方法,因為它是一種后置過濾器,而不是前置過濾器):
rnkDate =
VAR t =
CALCULATETABLE(
VALUES(tstTable[Date]),
REMOVEFILTERS(tstTable[Date])
)
RETURN
//IF( MAX(tstTable[Amount])<>BLANK(), // WORKAROUND To hide unwantedd rows
RANKX(
t,
LASTDATE(tstTable[Date])
)
//)
PS Mess 只有在我使用維度表dimType[Type]
中的字段時才會發生(在一個表中一切正常):
問題在於 Power BI 生成的查詢執行笛卡爾積並通過檢查度量結果來歸檔結果。
在我們的例子中是類似於
SUMMARIZECOLUMNS(
'dimType'[Type],
'tstTable'[subType],
'tstTable'[Date],
"MinAmount", CALCULATE(MIN('tstTable'[Amount])),
"lastDate", 'tstTable'[lastDate],
"rnkDate", 'tstTable'[rnkDate]
)
SUMMARIZECOLUMNS 在不同表上迭代時不使用關系,它在評估度量時應用它們。 有一篇文章解釋了 SUMMARIZECOLUMNS 執行的等效 DAX 代碼是什么
問題是 RANKX 在空表上的計算返回 1。這可以在dax.do上執行
EVALUATE
VAR t =
FILTER ( ALL ( 'Date'[Date] ), FALSE )
RETURN
{ RANKX ( t, [Sales Amount] ), CALCULATE ( [Sales Amount], t ) }
所以解決方案是首先檢查表 t 是否為空,這是因為您實施的解決方法解決了這個問題
rnkDate =
VAR t =
CALCULATETABLE(
VALUES(tstTable[Date]),
REMOVEFILTERS(tstTable[Date])
)
RETURN
IF( NOT ISEMPTY(t),
RANKX(
t,
LASTDATE(tstTable[Date])
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.