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
2,检查筛选上下文中是否只有一个值

 当column的上下文被过滤为只有一个唯一值时,返回该唯一值,否则返回alternateResult。

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

该函数等价于:

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

 

参考文档:

 

posted @ 2022-05-19 13:28  悦光阴  阅读(517)  评论(0编辑  收藏  举报