PowerBI/DAX之理解INTERSECT函数

INTERSECT函数属于集合函数,可以对表实现数学定义上的取交集操作,将返回两个表中都具有的相同行。


语法和作用

语法:

INTERSECT ( <LeftTable>, <RightTable> )

作用:对左右两个表取交集,从左表中找出那些同时存在于右表的行。

注意:

1、INTERSECT 的参数不可交换。通常,INTERSECT(T1, T2)的结果与 INTERSECT(T2, T1)的结果有不同的含义。

2、返回的结果会保留重复行,只要左表中的行能在右表中找到,那都会被返回。

3、用作参数的两个表必须具有相同的列数。

4、在左右两个表进行比较时,是按位置进行比较的,而不是按照列名。

5、最终返回的表的列名与左表的一致,且会继承左表的数据沿袭。

6、最终返回的表不会包含扩展表,即使左表存在扩展表。


辅助理解的例子

1、如下图所示,INTERSECT函数将返回左表中的那些同时存在于右表的行,比如A3产品不存在于TableB,因此A3产品的这一行就不会被返回。另外返回结果会保留重复行,比如B2产品的行。

2、如果用代码来表示的话,那么INTERSECT函数的等价写法如下:

INTERSECT('TableA','TableB')

等价于:

EVALUATE
FILTER(
	SELECTCOLUMNS('TableA','TableA'[产品类别],'TableA'[产品名称],'TableA'[销售金额]),  
	('TableA'[产品类别],'TableA'[产品名称],'TableA'[销售金额]) IN 'TableB'	
)

3、INTERSECT 的参数不可交换,如果将左表和右表互换位置,那么得到的结果通常并不一致,如下图所示:

4、用作参数的两个表必须具有相同列数,否则会报错,如下图所示:

5、在左右两个表进行比较时,是按位置进行比较的,而不是按照列名,因此列顺序也要一致。如果列顺序不一致,通常会因为两表无法比较而得到空表,如下图所示:

6、INTERSECT函数最终返回的表不会包含扩展表,即使左表存在扩展表,如下图所示:

7、可以使用INTERSECT函数来进行筛选器转移,达到更改数据沿袭的目的,如下图所示:


总结

INTERSECT函数的行为类似于数学定义上的取交集,这与筛选器的相交操作是不同的,需要注意区分。

<think>好的,我现在需要解决用户的问题:如何在Power BI中筛选表一中不包含表二的值。让我仔细思考一下这个问题。 首先,用户可能有两张表,表一和表二,他们希望筛选出表一中那些在某个字段上不存在于表二的数据。例如,表一可能有客户列表,表二有订单记录,用户想找出没有下过订单的客户。 接下来,我需要回忆Power BI中处理这种情况的常用方法。通常,可以使用DAX表达式或者利用模型关系来实现。不过,这里可能需要更具体的步骤。 一种常见的方法是使用DAX的FILTER函数和NOT以及RELATED函数。不过,如果两个表之间没有建立关系,可能需要使用其他方法,比如EXCEPT函数或者合并查询。 假设表一和表二有一个共同的字段,比如ID。如果这两个表已经建立了关系,那么可以使用RELATED函数来检查是否存在关联的记录。如果没有关系,可能需要使用LOOKUPVALUE或者合并查询来处理。 不过,DAX中的EXCEPT函数可能更直接。EXCEPT函数可以返回第一个表中存在但第二个表中不存在的行。但需要注意的是,EXCEPT要求两个表的列结构完全相同,这可能不适用,如果用户只需要比较单个字段的话。 另一种方法是使用CALCULATETABLE和FILTER的组合。例如,创建计算表,筛选出表一中不存在于表二的记录。这时候可能需要使用NOT和CONTAINS函数。 或者,使用合并查询在Power Query中处理。将表一和表二合并,根据共同字段左反连接,这样可以得到表一中不在表二中的记录。 现在需要考虑用户的技能水平。如果他们更熟悉Power Query,可能合并查询的方法更直观。如果是偏好DAX,则需要编写相应的表达式。 可能的步骤包括: 1. 确保两个表有一个共同的字段。 2. 在Power Query中使用合并查询,选择左反连接。 3. 或者在DAX中创建计算表,使用FILTER和NOT EXISTS函数。 需要验证这些方法的正确性。例如,在DAX中,正确的表达式可能类似于: FILTER(表一, NOT(CONTAINS(表二, 表二[ID], 表一[ID]))) 或者使用EXISTS函数: FILTER(表一, NOT(EXISTS(SELECTCOLUMNS(表二, "ID", 表二[ID]), 表二[ID] = 表一[ID]))) 另外,EXCEPT函数的用法可能不适用,如果表结构不同的话,所以可能需要调整。 还需要考虑性能问题,如果数据量很大,合并查询可能更高效,或者在模型中建立关系后使用计算列。 总结可能的解决步骤: 方法一:使用Power Query合并查询 1. 在Power Query中加载表一和表二。 2. 在表一中执行合并查询,选择表二,选择共同字段,左反连接类型。 3. 展开合并后的列(如果有需要),即可得到表一中不在表二的记录。 方法二:使用DAX创建计算表 1. 在建模视图中,新建计算表。 2. 使用FILTER和CONTAINS函数来筛选表一中不存在于表二的记录。 例如: 结果表 = FILTER(表一, NOT(CONTAINS(表二, 表二[ID], 表一[ID]))) 或者使用变量来优化: 结果表 = VAR IDsInTable2 = VALUES(表二[ID]) RETURN FILTER(表一, NOT(表一[ID] IN IDsInTable2)) 需要注意的是,这里的IN操作符在DAX中可能需要使用CONTAINSROW函数,或者使用INTERSECT函数来判断存在性。 如果用户需要动态筛选,可能需要使用度量值或计算列,并结合视觉级筛选器。但对于生成一个静态的结果表,计算表是合适的。 最后,需要确保用户理解如何应用这些步骤,并验证结果是否正确。例如,测试某些在表二存在的ID是否被正确排除,以及不存在的ID是否被包含在结果中。</think>在Power BI中筛选表一中不包含表二的值,可以通过以下两种方法实现: --- ### **方法一:使用Power Query(合并查询)** **适用场景**:静态数据清洗,生成新表。 1. **加载数据**: - 在Power Query编辑器中导入表一和表二。 2. **执行左反连接**: - 选中表一 → 选择**合并查询** → 选择表二 → 勾选共同字段(如`ID`)。 - 在**连接类型**中选择**左反**(仅保留第一个表中未匹配的行)。 3. **展开结果**: - 合并后,若需保留表一的完整字段,直接删除表二扩展的列。 4. **加载新表**: - 生成的表即为表一中不包含表二的值。 --- ### **方法二:使用DAX创建计算表** **适用场景**:动态筛选,依赖模型关系。 1. **假设条件**: - 表一和表二有共同字段(如`ID`)。 - 若未建立关系,需通过DAX匹配值。 2. **DAX公式**: ```dax 结果表 = FILTER( 表一, NOT(CONTAINS(表二, 表二[ID], 表一[ID])) ) ``` - 或使用变量优化: ```dax 结果表 = VAR IDsInTable2 = VALUES(表二[ID]) RETURN FILTER(表一, NOT(表一[ID] IN IDsInTable2)) ``` 3. **验证结果**: - 创建表格视觉对象,检查结果是否过滤了表二中存在的值。 --- ### **关键注意事项** 1. **字段一致性**:确保比较的字段(如`ID`)类型和内容一致。 2. **性能优化**:若数据量大,优先使用Power Query处理。 3. **动态筛选**:若需实时联动,建议通过模型关系结合度量值实现。 通过以上方法,可高效筛选出表一中独有的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值