INTERSECT 返回一个表,其中只包含作为参数的两个表表达式中都存在的行。两个表必须具有相同的列数和数据类型,并且这些列在各自的表中按位置组合。第一参数定义了结果中列的名称,后续参数可以修改返回的行数,但不影响列名。
INTERSECT
INTERSECT ( <LeftTable>, <RightTable> )
INTERSECT 进行交集运算,返回那些出现在右侧表中的左侧表的行。
参数 | 属性 | 描述 |
---|---|---|
LeftTable | 交集运算使用的左表表达式. | |
RightTable | 交集运算使用的右表表达式 |
注意
- INTERSECT 的参数不可交换。通常,INTERSECT(T1, T2)的结果与 INTERSECT(T2, T1)的结果有不同的含义。
- 保留重复的行。如果有一行同时出现在 INTERSECT 的两个参数中,那么它和它在 Left Table 中的所有相同行都会返回。
- 返回的表的列名与 Left Table 中的列名匹配。具有 Left Table 的数据沿袭,与第二个表中的列的沿袭无关。例如,如果左表的第一列有沿袭到模型的列 C1,INTERSECT 将移除那些只在 Right Table 上存在的记录,并保持基列 C1 的沿袭不变。
- 列根据所处位置进行比较,数据比较不进行强制类型转换。
- 返回的表不包括与 LeftTable 相关的表的列,也就是不支持扩展表理论
示例用法
结果保留两个参数中第一个表的沿袭。例如,以下查询保留了数据模型中物理列的沿袭,即使作为第二参数的表不具有相同沿袭:
EVALUATE INTERSECT ( VALUES ( Product[Color] ), UNION ( ROW ( "Color", "Red" ), ROW ( "Color", "Blue" ) ) )
如果将两个参数反转,结果是相同的,但你不能将其用作筛选器参数,因为它没有继承物理列的沿袭:
了解如何在筛选上下文中使用 INTERSECT 非常重要,因为这是它最常用的应用场景。在以下示例中,你将看到如何获得在 2008 年和 2009 年都购买过手机类别产品的客户列表:
EVALUATE CALCULATETABLE ( VALUES ( Customer[Customer Code] ), INTERSECT ( CALCULATETABLE ( SUMMARIZE ( Sales, Customer[CustomerKey], Product[ProductKey] ), 'Date'[Calendar Year Number] = 2008, 'Product Category'[Category] = "Cell phones" ), CALCULATETABLE ( SUMMARIZE ( Sales, Customer[CustomerKey], Product[ProductKey] ), 'Date'[Calendar Year Number] = 2009, 'Product Category'[Category] = "Cell phones" ) ) )
不适用扩展表
INTERSECT 的结果不适用扩展表理论,即使结果表具备数据沿袭,你也无法将其作为筛选上下文筛选关系一端的表。这是一种特殊情形,与 INTERSECT 类似的还有 UNION 和 EXCEPT,它们在筛选上下文中仅筛选自身包含的列,不涉及扩展表。
老师这里两个红框部分, 换成’Product Category'[Category]可以吗?
contoso的customercode是纯数字,最后的运行结果带了CSxxxxx是咋回事