DAX:直接过滤,交叉过滤和唯一值
在筛选上下文中,一列可能是由于应用了过滤器而被直接筛选,也可能是由于关系的传递,其他列被筛选而导致该列被间接筛选。因此,可以把数据模型中的筛选分为直接过滤和交叉过滤。
一,判断直接过滤和交叉过滤
直接过滤:当过滤器直接作用到表中的一列上时,该列是被直接过滤的。直接过滤是由外部的切片器和查询上下文中的行和列过滤器确定的,不受交叉过滤器的影响。
注意:如果外部切片器没有勾选任何选项时,默认显示基础表中所有的唯一值。
交叉过滤:当过滤作用于同一个表的另一列上,或作用于相关表上时,该列是被交叉过滤的,交叉过滤受到到所有筛选上下文的影响。
A column or table is said to be cross-filtered when a filter is applied to ColumnName, any column of TableName, or to any column of a related table.
A column or table is said to be filtered directly when a filter is applied to ColumnName or to any column of TableName.
直接过滤和交叉过滤可以通过下面两个函数来识别:
ISCROSSFILTERED(<columnName>) ISFILTERED(<columnName>)
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的数量。
二,直接过滤的值 FILTERS函数
直接过滤的值可以通过FILTERS函数直接过滤,对于筛选上下文中的值,最常用的函数是:DISTINCT和VALUES。
FILTERS函数返回被切片器直接筛选的值
FILTERS(<columnName>)
三,获得筛选上下文中的可见值
如果需要返回交叉过滤的唯一值,可以使用DISTINCT 和 VALUES函数,这两个函数都受到过滤上下文的作用,唯一的区别是:
当原始表中不存在BLANK时,DISTINCT 只返回原始表中的值,而VALUES可能会返回BLANK,该数据是被添加到查询中用于表示不相关的行。
DISTINCT 和 VALUES函数的定义是:
DISTINCT(<table | column>) VALUES(<Table | Column>)
四,检查唯一值
HASONEFILTER函数用于检查过滤器上是否只过滤一个值,而SELECTEDVALUE用于检测筛选上下文中某列上只有一个值。
1,检查过滤上是否只存在一个值当 columnName 上的直接过滤值的数量为 1 时,返回 TRUE,否则返回 FALSE。
HASONEFILTER(<columnName>)
该函数等价于:
COUNTROWS(FILTERS(<columnName>)) = 1
当 columnName 被筛选上下文过滤到只有一个值时,返回 TRUE。 否则为假。
HASONEVALUE(<columnName>)
该函数等价于:
COUNTROWS(VALUES(<columnName>)) = 1
当column的上下文被过滤为只有一个唯一值时,返回该唯一值,否则返回alternateResult。
SELECTEDVALUE(<column>[, <alternateResult>])
该函数等价于:
IF(HASONEVALUE(<column>), VALUES(<column>), <alternateResult>)
参考文档: