Power BI“新表”
我们在之前以及后面将进一步学习到:表函数构成了 DAX 作为查询语言的基础。并且表函数可以在本地使用,以便在查询工具中返回结果表。
表函数还可以在 "Power BI" 中使用具有 "新建表" 功能(在“建模”菜单上), 以便在数据模型中创建新的物理表。这符合扩展表的行为—添加计算需要的列表。所以将Power BI的新表也作为扩展表系列的一部分。
通常情况下,在PowerBI里进行分析的各种数据表都是从外部的一种或多种数据源导入进来的。但事实上,并不总是如此,某些情况下,在PowerBI Desktop中也可以根据需要直接创建各种需要的表。也就是说,在进行数据分析的过程中,也许还需要加入新的数据列表或者新的维度参数列表,而我们可能基于以下一些考虑:
(1)并不希望从外部数据源加载数据;
(2)只是临时使用某些列表(比如作为筛选参数),不希望回到PQ编辑器或其他来源表里进行处理;
(3)只是临时定义某个公式的参数列表;
(4)不希望影响原有列表关系模型。
那么,可以利用已加载到模型中的数据进行构建新表,下面就来看看如何在PowerBI Desktop中的“新表",以及几种常见的使用场景。
“新表”功能
这很简单,在Power BI【建模】选项卡下点击【新表】,就可以创建一个表了。
Power BI的“新表”以及“新建参数”是Power BI Desktop的新功能。你可以使用任何返回表的计算式来创建新的表。
通常,Power BI只对已存在于数据模型里的数据进行建模分析,所谓新增的物理列表需要在加载前的数据源表或在Powerqurey中(ETL)中进行处理。但是“新表”让Power BI直接具有在数据模型里添加物理数据列表的功能。
例如,我们新建一个空值的表:
例如,新建一个“日期表":(点击建模新表,录入 公式即可,或者直接新建度量,产生结果表)
在DAX中,对于一些表函数的行为,我们总觉得很难理解,这可能因为:这些表函数创建的表实际是一种虚拟表(由存储引擎在内存里执行的存储数据,你不能直观的看见它,其结果也不可视)。 所以,这就很难直观的查看到表函数产生的结果、以及所运行的错误在哪里。
其实,除了使用DAX STUDIO之外,你现在知道:还可以使用PowerBI的"新表"作为列表结果的查询、调试工具。
例如,你希望了解:UNION、INTERESCT、CROSSJOIN、NATURALINNERJOIN、NATURALLEFTOUTERJOIN等这些表函数,并需要查看由这些表函数定义的计算结果,在不使用DAX STUDIO的情况下,可以使用Power BI的“新表”功能:
例如:我们希望查看由UNION并集函数构建的结果列表:
上图由UNION并集函数将来自VALUES()定义的两个唯一值列表(可以来自不同表里的关系列表)组合在了一起。从UNION函数定义计算的结果表可观察到:它的功能是纵向追加数据,和PQ里的“追加查询”功能相似。
而且,这个表可充当数据模型里的物理表使用。
“新表”实例
让我们来揭示DAX里一个巨大的秘密武器库。
在使用DAX的过程中,你会接触到它,只是还没有一把“钥匙”而已。
比如,你希望像使用VLOOKUP函数那样,向数据里引用一个或多个需要的物理列表来参与计算,而不需要从数据模型外导入或引入新的维度表(ETL)?答案是,太可以了!(前面已经讨论)。
最新的PowerBI中已体现了列表数据模型的该需求行为的理念设置,这是巨大的宝库,创建列表的宝藏之处!再次请记住这个位置:
如果不是想定义标量值的度量或计算列,而是需要一个物理性的列表,你可以使用“新表”,并使用任何结果为表的函数来定义生成你需要的表(一个或多个列表)。
例如,我们知道VALUES()函数是一个能生成唯一值的列表函数(结果返回表),好,我们使用它,来生成一个需计算需要的唯一值列表(也许正发愁找不到一个关系字符列表来创建列表关系)。
假如引用的是数据模型里info_product表的[产地]列,则马上生成一个已定义的表:列1 表。
在数据列表关系视图中,你可以看到它的身影,它其实就是一个物理表,具有物理表的一切特性(如可以与其他表建立关系等)。从这里还可以看出,【新表】的作用是:在不影响原有数据模型、有新表需求的前提下可以任意的创建你所需要的物理列表。
继续试验由NATURALINNERJOIN函数定义的结果表:
很容易观察到结果列表集为两个表的横向的合并联结集。
该表依据NATURALINNERJOIN定义的两个参数表组合在一起,NATURALINNERJOIN函数类似于我们最熟悉的VLOOKUP函数,它的参数就是两个表格,不过它连接的两个表需要区分先后顺序,第一个表是基表,第二个表是联结表,类似于左联结(LEFT JION)。
通过以上举例,在Power BI中"新表",与其他从外部数据导入的物理表并没有区别,它可以和其他表建立关系、也可以添加到报表进行可视化、作为维度表(参数表)、定义计算需要的筛选列表等等。而且,因为是引用原物理表的列表构建的,那么,一旦源数据变动,这些新表同样会自动更新(具有列表血缘关系)。
注意:也并不是说新表与物理表之间就毫无区别,在列表血缘以及内部引擎上还是存在细微的差异,不过你无须考虑这些。
我们以前其实已经提示过:DAX里有粗旷的列表、细腻的列值。由于“新表”实际可看成是物理表。那么,由于列表间物理关系的存在(血缘),使得不同的列表之间可以任意组合(合纵连横)。
我们试想一下,由于新表还可以由定义结果为表的计算度量来生成,由于度量的筛选与条件的千变万化(参数的不同)而使得"新表“拥有无比的多样性。
并且,"新表"是用DAX函数构建的,这让它又变得十分灵活高效,利用DAX的强大功能,新表的使用场景应该远不止于此......。