GENERATE 函数对 Table1 的每一行计算 Table2,返回 Table1 中每一行与 Table2 的相应行之间生成的笛卡尔积。GENERATE 使用两个表表达式:
GENERATE- GENERATE ( <Table1>, <Table2> )
复制代码参数 | 属性 | 描述 | Table1 | | GENERATE 使用的基础表. | Table2 | | 在 Table1 的每一行计值的表表达式 |
GENERATEALL- GENERATEALL(<Table1>, <Table2>)
复制代码参数 | 属性 | 描述 | Table1 | | GENERATEALL 使用的基础表. | Table2 | | 在 Table1 的每一行计值的表表达式 |
GENERATEALL 与 GENERATE 的计值过程相同,仅在对空行的处理上有所区别。当对<Table2>的计算返回空记录时,GENERATEALL 将来自<Table1>的当前行包含在结果中。这与 GENERATE 不同,后者移除所有空值对应的<Table1>当前行。
另外,与 CROSSJOIN 类似,GENERATE 系列函数的 Table1 和 Table2 中的所有列名不能有重复,否则将报错。
示例用法
GENERATE 的一个简单用法是生成包含产品类别和子类别的所有有效组合的表,你可以使用这个查询:
- EVALUATE
- GENERATE (
- 'Product Category',
- RELATEDTABLE ( 'Product Subcategory' )
- )
复制代码
GENERATE 调用的 Table2 通常包含 RELATEDTABLE 或 CALCULATETABLE 函数,以便使用 Table1 迭代的行上下文进行上下文转换。
实际上,以下查询是等效的:
- EVALUATE
- GENERATE( 'Product Category', 'Product Subcategory' )
- EVALUATE
- CROSSJOIN( 'Product Category', 'Product Subcategory' )
复制代码
GENERATE 的一个更有趣的例子是如何得到一个表,使其包含每年销售量排名前两位的产品。以下查询对每一年执行 TOPN 函数,计算每一年中对应产品的排名:
- EVALUATE
- GENERATE (
- VALUES ( 'Date'[Calendar Year] ),
- TOPN (
- 2,
- SUMMARIZE (
- RELATEDTABLE ( Sales ),
- Product[Product Name]
- ),
- CALCULATE (
- SUM ( Sales[Quantity] )
- )
- )
- )
复制代码
这里需要注意的是,查询只返回那些至少包含一笔销售记录的年份。如果你还希望在销售表中包含没有任何销售记录的年份,可以使用 GENERATEALL 代替 GENERATE,如以下查询所示:
- EVALUATE
- GENERATEALL (
- VALUES ( 'Date'[Calendar Year] ),
- TOPN (
- 2,
- SUMMARIZE (
- RELATEDTABLE ( Sales ),
- Product[Product Name]
- ),
- CALCULATE (
- SUM ( Sales[Quantity] )
- )
- )
- )
复制代码
如果你习惯使用 SQL,你可以认为 GENERATE 函数类似于 SQL 中的 CROSS APPLY 条件,而 GENERATEALL 函数类似于 SQL 中的 OUTER APPLY 条件 |