DAX:直接過濾和交叉過濾

在篩選上下文中,一列可能是由於應用了過濾器而被直接篩選,也可能是由於關係的傳遞,其他列被篩選而導致該列被間接篩選。因此,可以把數據模型中的篩選分爲直接過濾和交叉過濾。

直接過濾:當過濾器直接作用到表中的一列上時,該列是被直接過濾的。直接過濾是由外部的切片器和查詢上下文中的行和列過濾器確定的,不受交叉過濾器的影響。

注意:如果外部切片器沒有勾選任何選項時,默認顯示基礎表中所有的唯一值。

交叉過濾:當過濾作用於同一個表的另一列上,或作用於相關表上時,該列是被交叉過濾的,交叉過濾受到到所有篩選上下文的影響。

direct_filtered_colors = COUNTROWS((FILTERS(DimProduct[Color])))
cross_filtered_distinct_colors = COUNTROWS((DISTINCT(DimProduct[Color])))
cross_filtered_values_colors = COUNTROWS((VALUES(DimProduct[Color])))

結果分析:

direct_filtered_colors:是直接過濾,不受交叉過濾上下文的影響,直接顯式基礎表中Color的唯一值的數量,

cross_filtered_values_colors 和 cross_filtered_distinct_colors :是交叉過濾,受到交叉過濾上下文的影響,只統計被過濾之後的Color的數量。

直接過濾和交叉過濾可以通過下面兩個函數來識別:

ISCROSSFILTERED(<columnName>) 
ISFILTERED(<columnName>) 

1,FILTERS函數

FILTERS函數返回被切片器直接篩選的值

FILTERS(<columnName>) 

2,返回篩選上下文中的篩選值

如果需要返回交叉過濾的唯一值,可以使用DISTINCT 和 VALUES函數,這兩個函數都受到過濾上下文的作用,唯一的區別是:

當原始表中不存在BLANK時,DISTINCT 只返回原始表中的值,而VALUES可能會返回BLANK,該數據是被添加到查詢中用於表示不相關的行。

DISTINCT 和 VALUES函數的定義是:

DISTINCT(<table | column>) 
VALUES(<Table | Column>) 

3,檢查是否只存在一個值

當 columnName 上的直接過濾值的數量爲 1 時,返回 TRUE,否則返回 FALSE。

HASONEFILTER(<columnName>)

該函數等價於:

COUNTROWS(FILTERS(<columnName>)) = 1

當 columnName 被篩選上下文過濾到只有一個值時,返回 TRUE。 否則爲假。

HASONEVALUE(<columnName>) 

該函數等價於:

COUNTROWS(VALUES(<columnName>)) = 1

4,更爲高效的SELECTEDVALUE

 當column的上下文被過濾爲只有一個唯一值時,返回該唯一值,否則返回alternateResult。

SELECTEDVALUE(<column>[, <alternateResult>])  

該函數等價於:

IF(HASONEVALUE(<column>), VALUES(<column>), <alternateResult>)

 

參考文檔:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章