何为投影函数(Projection)
关系代数中有五个基本运算:选择、投影、笛卡尔积、集合并、集合差,它们能实现大多数我们常用的数据检索操作。此外还有连接、集合交、除运算等,它们都可以通过五个基本运算表示出来。
投影运算作用于单个关系 R,得到由 R 的一个列子集构成的新关系,如图所示:
DAX 中的投影函数
DAX 作为查询语言的时候,缺少像投影这样的功能。实际上,DAX 允许你向表中添加列,但不能从表中直接删除某些列。为了实现投影运算,你可以使用 SUMMARIZE 从当前表中提取指定的列,或者使用 ADDCOLUMNS 从一个必须包含在查询中的列开始,添加新的列,这种方式添加的是原表已有的列。在本章的后面你会了解到,当你向表中添加原表不存在的新列时,我们称之为添加派生列,这是更常见的情景。
下面的代码从 Product 表中提取产品 ID,产品名称和价格三列
SELECT [Product Id], [Product Name], [List Price] FROM Product
EVALUATE ADDCOLUMNS( DISTINCT( Product[Product Id] ), "Product Name", CALCULATE( VALUES( Product[Product Name] ) ), "List Price", CALCULATE( VALUES( Product[List Price] ) ) )
EVALUATE SUMMARIZE( Product, Product[Product Id], Product[Product Name], Product[List Price] )
DAX 可以通过两种方式获得相同的结果。你可以利用 Product ID 列的唯一性,通过 ADDCOLUMNS 函数基于此 ID 列来添加其他列。为了检索每个产品的对应值,你需要加入 CALCULATE 和 VALUES,注意,当产品 ID 不是表的唯一键时查询会报错。
建议总是使用 SUMMARIZE 来执行对表的投影,因为它更容易阅读,并且比其他 DAX 函数具有更好的性能
您好,老师。
发现使用summarize提取两列,如果行出现了重复值,summarize会保留重复行,根据关系代数的投影,是会消除重复行的,是这样吗?
老师,没明白,难道SELECTCOLUMNS不是投影吗?投影算是数据沿袭的一种吗?
要是有视频就好啦,没有视频有些还是比较难懂