从数据到信息
从信息到洞察

GENERATE 和 GENERATEALL

GENERATE 函数对 Table1 的每一行计算 Table2,返回 Table1 中每一行与 Table2 的相应行之间生成的笛卡尔积。GENERATE 使用两个表表达式:

GENERATE

GENERATE ( <Table1>, <Table2> )
参数 属性 描述
Table1 GENERATE 使用的基础表.
Table2 在 Table1 的每一行计值的表表达式

GENERATEALL

GENERATEALL(<Table1>, <Table2>)
参数 属性 描述
Table1 GENERATEALL 使用的基础表.
Table2 在 Table1 的每一行计值的表表达式

GENERATEALL 与 GENERATE 的计值过程相同,仅在对空行的处理上有所区别如果 Table1 中当前行的 Table2 的计算结果返回一个空表,那么来自 Table1 的当前行将被包含在结果中,与 Table2 对应的列将为该行提供空值。这与 GENERATE 不同,后者不会将来自表 1 的当前行包含在结果中。

另外,与 CROSSJOIN 类似,GENERATE 系列函数的 Table1 和 Table2 中的所有列名不能有重复,否则将报错。

示例用法

GENERATE 的一个简单用法是生成包含产品类别和子类别的所有有效组合的表,你可以使用这个查询

EVALUATE
GENERATE (
    'Product Category',
    RELATEDTABLE ( 'Product Subcategory' )
)

GENERATE 调用的 Table2 通常包含 RELATEDTABLECALCULATETABLE 函数,以便使用 Table1 迭代的行上下文进行上下文转换

如果在第二参数中省略 RELATEDTABLE,将得到与 CROSSJOIN 相同的结果,因为没有通过 RELATEDTABLE 将行上下文转换为筛选上下文,(RELATEDTABLE 是 CALCULATEDTABLE 简化版的别名)

实际上,以下查询是等效的:

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 条件

说点什么

avatar
1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
  订阅本文评论  
提醒
DAX 圣经

导读

初识 DAX

DAX 基础知识

DAX 原理

DAX 高级原理

基础函数类型

迭代函数

CALCULATE 函数

CALCULATE 调节器

基础表函数

条件判断函数

查找匹配函数

时间智能函数

统计类函数

投影函数

分组/连接函数

集合函数

其他函数