[知识体系] 理解 CROSSJOIN

  [复制链接]
查看224977 | 回复171 | 2021-2-21 18:51:13 | 显示全部楼层 |阅读模式
CROSSJOIN 函数在两个或多个表之间生成笛卡尔乘积。你可以使用任何表表达式作为参数;只需将它们全部放入参数中,如以下语法所示:

CROSSJOIN
  1. CROSSJOIN ( <table1>, <table2>, [<tableN> ... ] )
复制代码

CROSSJOIN 返回一个表,其中包含参数中所有表的所有行的笛卡尔积,新表中的列包含所有参数表的所有列。

参数属性描述
Table可重复参与 CROSSJOIN 计算的表


7064211942081.png

笛卡尔乘积示意图

注意

  • 来自表参数的列名不能有重复,否则将返回错误
  • CROSSJOIN 返回表的总行数等于所有参数表行数的乘积,总列数是所有表中列数的总和。例如,如果表 A 是某学校学生的集合,表 B 是该学校所有课程的集合,则 A 与 B 的笛卡尔积表示所有可能的选课情况。表 A 是所有声母的集合,表 B 是所有韵母的集合,那么 A 和 B 的笛卡尔积就是所有可能的汉字全拼。

示例用法

生成多列的组合值是 CROSSJOIN 的一个典型应用,如以下示例所示:
  1. EVALUATE
  2. CROSSJOIN (
  3.     VALUES ( 'Product'[Stock Type] ),
  4.     VALUES ( 'Product Category'[Category] )
  5. )
复制代码


7064211942082.jpeg



结果包含了一个表的所有行与其他表的所有行的全部组合,包括所有表的所有列。如果 CROSSJOIN 中使用的两个或更多表具有相同的列名,则必须使用完全限定名(包括表名和列名)来标识列,如下例所示:
  1. EVALUATE
  2. CROSSJOIN ( 'Product Category', 'Product Subcategory' )
复制代码

两个表都包含 ProductCategoryKey 列,为了避免出现歧义,这一列在结果中有两个完全不同的限定名称。



7064211942083.jpeg



以上是引擎自动生成的结果,如果你在 Power BI Desktop 中使用新建表的方式创建以上查询,会收到列名重复的提示。当你需要在 CROSSJOIN 的结果中包含同名列的时候,为了避免完全限定名称产生重复,必须提前重命名该列。例如,以下查询返回产品库存类型与其自身的所有组合:
  1. EVALUATE
  2. CROSSJOIN (
  3.     VALUES ( Product[Stock Type] ),
  4.     SELECTCOLUMNS (
  5.         VALUES ( Product[Stock Type] ),
  6.         "Alternate Type", Product[Stock Type]
  7.     )
  8. )
复制代码

正如你在结果中看到的,结果中的两列具有相同的沿袭,在数据沿袭一文中你将了解到,CROSSJOIN 生成的表可以具备多个表的沿袭,在用作筛选器参数时可以筛选多张表。


7064211942084.jpeg

两列的数据沿袭相同

生成内连接的表



以下查询生成表 a 和表 b 的内连接(inner join)结果
  1. EVALUATE
  2. FILTER (
  3.     CROSSJOIN ( a, b ),
  4.     a[key] = b[key]
  5. )
复制代码
回复

使用道具 举报

发现者 | 2021-4-24 12:58:29 来自手机 | 显示全部楼层
沙发~支持云发教育
回复

使用道具 举报

zgfzgf | 2021-9-5 23:59:04 | 显示全部楼层
前排支持下
回复

使用道具 举报

hijackhan | 2021-10-29 22:07:10 来自手机 | 显示全部楼层
不错 支持下
回复

使用道具 举报

ysy555 | 2021-11-10 21:24:20 | 显示全部楼层
嘘,低调。
回复

使用道具 举报

hhm | 2021-11-20 13:09:13 来自手机 | 显示全部楼层
无论是不是沙发都得回复下
回复

使用道具 举报

阿娇 | 2021-12-5 07:16:37 来自手机 | 显示全部楼层
好,很好,非常好!
回复

使用道具 举报

LOVE | 2021-12-22 19:15:34 | 显示全部楼层
我也顶起出售广告位
回复

使用道具 举报

zr345 | 2022-1-3 08:59:54 | 显示全部楼层
顶顶更健康
回复

使用道具 举报

伟哥 | 2022-1-22 15:41:07 | 显示全部楼层
前排顶,很好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则