INTERSECT函数左右表互换,结果不一样!DAX的这个重要特性一定要理解!| PP实战
- 1 -
INTERSECT是DAX的重要函数之一,使用方式为intersect(表1,表2),它的基本功能是获得两个表的交集,如下图所示:
既然这样,那么,如果单纯从返回的数据结果来看,把两表的位置进行互换,所得的结果应该是一样的。
举个具体的例子,比如有表1和表2如下所示:
那么,如果我们用DAX新建表,无论是用 INTERSECT('表1','表2')
,还是 INTERSECT('表2','表1'),结果的内容都是一样的:
但是,细心的朋友可能也会发现,虽然包含的内容是一样的,但是,顺序却不一样!
为什么呢?
这是因为INTERSECT函数运算时以左表为基准,判断右表是否存在相应的值,所以,生成的结果以左表为基准,内容的排列顺序也按左表的原始顺序。
如果单纯从数据本身来说,这个顺序问题也没什么特别影响。但是,如果将INTERSECT函数用作筛选(计算上下文),左右表的位置的不同,对结果会有明显的影响。
- 2 -
比如我在前面的文章《【免费视频】虚虚实实的各种表间关系,咋整?这个交叉关联分析案例一次全讲完!| DAX实战》里,在多个解法里使用INTERSECT函数:
视频主要内容:
1、基于仓库商品表构建仓库及辅助仓库维度表;
2、四种表间关系设置及其筛选(计算)方法:
2.1 表间不建关系;
2.2 表间全部构建活动关系;
2.3 表间全部构建非活动关系;
2.4 与仓库主表构建活动关系,与辅助表构建非活动关系。
视频中讲到使用INTERSECT函数的使用,有的朋友就在尝试将两个表进行互换,发现得到的结果完全不一样:
这里的问题跟前面用intersect新建表的情况类似,intersect函数引用两个表,无论两个表的位置如何,函数本身得到的“数据”结果其实是没有差别的。
但是,这两个度量的结果却完全不一样,根本原因不是intersect本身的“数据”结果不同,而是intersect返回的结果对后续的影响不同:intersect的计算以第一个参数表为基础,生成的结果也会继承第一个表的筛选器作用!
所以,对于“测试”度量来说,因为第一个表是fact,所以intersect函数返回的结果会对前面calculatetable函数的计算参数有影响:
而对于“测试_反转顺序”来说,intersect函数第一个参数为dim表,返回结果对fact仓库表不起筛选作用(这里两表间没有建立活动关系):
而如果建立了'dim仓库'表和'fact仓库商品表'之间的激活关系,那'dim仓库'表对'fact仓库商品表'也存在筛选关系,那“测试”和“测试_反转顺序”两个度量的结果就一样了:
具体数据及度量情况,大家可按以下链接下载本文配套数据测试:
https://share.weiyun.com/9VdCbtA4
最后,再次强调DAX里的这个【重要特性】:
DAX里要注意的不光是返回来的结果“数据”本身,还要注意返回的是什么表,什么列,这些列是否会对其他计算有影响——虽然返回的数据一样,但是,对其他计算的影响不一样。
相关文章
- 如何防止数据重复插入?| 签到福利
- 保存数据为CSV文件
- PingCAP 入选 CB Insights 中国「数据链路安全领航者」榜单,保障全球用户存储安全
- 43. R 数据可视化(一: 用R制作漂亮的表格)
- Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
- 61-R可视化-9-对已有统计结果数据做统计分析绘图
- 65-R茶话会14-柱状图用col还是bar,你可以省一点空间
- 一文带你吃透Redis
- MongoDB 介绍
- Kafka 介绍
- Spring Boot 2 WebFlux 集成 Redis
- Opengrok代码阅读工具
- WebFlux 集成 Redis 实现缓存 | Spring Boot 2
- Redis 介绍
- Elasticsearch 数据写入原理 | 原创不易
- stata:tab命令举例
- 搜索如何倒排索引?如何模糊匹配?
- Spring笔记6——SSM整合
- 数值的整数次方
- Elasticsearch 7.x 之文档、索引和 REST API