Power BI: NATURALINNERJOIN的使用

news2025/3/1 2:38:06

查看官方的文档,NATURALINNERJOIN描述是这样的:

语法

NATURALINNERJOIN(<LeftTable>, <RightTable>)  

参数

术语

定义

LeftTable

用于定义联接左侧的表的表表达式。

RightTable

用于定义联接右侧的表的表表达式。

返回值

一个表,仅包含两个表的指定共有列都存在值的行。 返回的表将具有左侧表的公用列以及这两个表中的其他列。

备注

  • 这些表在两个表的共有列(按名称)上联接。 如果两个表没有公共列名,则返回错误。

  • 结果没有排序顺序保证。

  • 两个表中要联接的列必须具有相同的数据类型。

  • 只能基于同一源表中的列(具有相同的世系)进行联接。 例如,对于 Products[ProductID]、WebSales[ProductdID] 和 StoreSales[ProductdID],WebSales 和 StoreSales 表与 Products 表之间存在基于 ProductID 列的多对一关系,因而 WebSales 和 StoreSales 表基于 [ProductID] 进行联接。

  • 联接期间使用严格的比较语义。 类型强制转换不适用;例如 1 不等于 1.0。

  • 在已计算的列或行级安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。

总结了一下,NATURALINNERJOIN主要运用在两个场景:

  1. 用于有关系的表

这个好理解,只需要将LeftTable、RightTable两个参数替换成已经建立关联关系的表名即可。

  1. 用于无关系的表

借助DAX圣经里面的例子:

EVALUATE
VAR A =
    UNION (
        ROW ( "Name", "Audio", "Value", 1 ),
        ROW ( "Name", "Audio", "Value", 2 ),
        ROW ( "Name", "Computers", "Value", 3 ),
        ROW ( "Name", "Games", "Value", 4 ),
        ROW ( "Name", "Music", "Value", 5 )
    )
VAR B =
    UNION (
        ROW ( "Name", "Audio", "Ext", 6 ),
        ROW ( "Name", "Computers", "Ext", 7 ),
        ROW ( "Name", "Computers", "Ext", 8 ),
        ROW ( "Name", "Games", "Ext", 9 ),
        ROW ( "Name", "TV", "Ext", 10 )
    )
RETURN
    NATURALINNERJOIN ( A, B )

在DAX Studio执行后得到的结果为:

圣经中还提到:

用于无关系表的注意事项:

NATURALINNERJOIN 通常用于无关系的两个表,在这种情况下函数遵循以下规则:

  • 结果不保证排序顺序。

  • 两表用于连接的公共列必须使用相同的名称,且具有相同的数据类型。

  • 连接使用的列必须具有相同的数据沿袭,或者都不具备数据沿袭。

  • 连接使用严格的比较语义。不会强制转换类型,例如,1 不等于 1.0。

用于关系表的注意事项:

NATURALINNERJOIN 可以用于存在关系的两个表,在这种情况下,通过 Power BI Desktop 新建表和在 DAX Studio 中创建查询的行为有所不同:

  • 在 Power BI Desktop 中使用此函数新建表,两表不能包含同名列,否则将报错。

  • 在 DAX Studio 中创建的查询不受同名列的限制,结果可以区分来自不同表的相同列。

圣经源地址:https://www.powerbigeek.com/understanding-naturalinnerjoin/

遇到的问题

在实际运用中,两个无关系的表在使用NATURALINNERJOIN往往出现各种问题,以下是我的问题分析过程:

已知两个表:factCostControl,factCosBreakdown

它们都有字段CostKey,且都是字符型,并已经建立了1对多的关联关系。

在某一个计算中需要使用到这两个表的数据,如果只是简单的检索他们的交集,写法很简单:

EVALUATE
NATURALINNERJOIN(
    ALL('factCosBreakdown'),
    ALL('factCostControl')
)

或者:

EVALUATE
NATURALINNERJOIN(
    'factCosBreakdown',
    'factCostControl'
)

以上两个公式,在没有任何外部筛选器的情况下,它们得到的结果是相同的,会检索出两个表相互交叉的所有数据。

而由于这两个表本身都有几十个字段,当我在使用ALL函数时,这两个表的几十个字段都参与计算,结果就导致性能很差,于是改进了写法:

EVALUATE
NATURALINNERJOIN(
    ALL(
        'factCosBreakdown'[CostKey],
        'factCosBreakdown'[MainProjectID],
        'factCosBreakdown'[ReportMonth],
        'factCosBreakdown'[CostType],
        'factCosBreakdown'[AllocationProjectID],
        'factCosBreakdown'[AllocationTypeID]
    ),
    ALL(
        'factCostControl'[CostKey],
        'factCostControl'[IsPair],
        'factCostControl'[ReportControlCentreNo]
    )
)

上面的写法中,我只提取了需要用到的字段,并用ALL将它们包起来,ALL会去掉作用在这个表上的所有筛选器,按文章开头说法,这样写应该是没问题的,它们都有一个同名同数据类型的字段CostKey,但在DAX Studio运行时却报错:

未检测到公用联接列。联接函数“NATURALINNERJOIN”至少需要一个公用联接列。

于是想到,虽然factCosBreakdown和factCostControl已经建立了关联关系,但是这种写法可能导致它们的关系已经失效,它们现在就相当于两个无关联关系的表,于是尝试改进写法:

EVALUATE
NATURALINNERJOIN(
    SELECTCOLUMNS(
        ALL(
            'factCosBreakdown'[CostKey],
            'factCosBreakdown'[MainProjectID],
            'factCosBreakdown'[ReportMonth],
            'factCosBreakdown'[CostType],
            'factCosBreakdown'[AllocationProjectID],
            'factCosBreakdown'[AllocationTypeID]
        ),
        "CostKey",[CostKey],
        "MainProjectID",[MainProjectID],
        "ReportMonth",[ReportMonth],
        "CostType",'factCosBreakdown'[CostType],
        "AllocationProjectID",[AllocationProjectID],
        "AllocationTypeID",[AllocationTypeID]
    ),
    SELECTCOLUMNS(    
        ALL(
            'factCostControl'[CostKey],
            'factCostControl'[IsPair],
            'factCostControl'[ReportControlCentreNo]
        ),
        "CostKey",[CostKey],
        "IsPair",[IsPair],
        "ReportControlCentreNo",[ReportControlCentreNo]
    )
)

使用SELECTCOLUMNS函数将需要的字段都提取出来,还是报错:

检测到不兼容的联接列(''[CostKey])。'NATURALINNERJOIN' 不支持使用具有不同的数据类型或世系的联接。

这个提示很明白,说CostKey字段数据类型不一致,但是在Power BI Desktop中查看,CostKey确实都是文本类型,想不明白,直接给它们强制转换:

EVALUATE
NATURALINNERJOIN(
    SELECTCOLUMNS(
        ALL(
            'factCosBreakdown'[CostKey],
            'factCosBreakdown'[MainProjectID],
            'factCosBreakdown'[ReportMonth],
            'factCosBreakdown'[CostType],
            'factCosBreakdown'[AllocationProjectID],
            'factCosBreakdown'[AllocationTypeID]
        ),
        "CostKey",CONVERT([CostKey],STRING),
        "MainProjectID",[MainProjectID],
        "ReportMonth",[ReportMonth],
        "CostType",'factCosBreakdown'[CostType],
        "AllocationProjectID",[AllocationProjectID],
        "AllocationTypeID",[AllocationTypeID]
    ),
    SELECTCOLUMNS(    
        ALL(
            'factCostControl'[CostKey],
            'factCostControl'[IsPair],
            'factCostControl'[ReportControlCentreNo]
        ),
        "CostKey",CONVERT([CostKey],STRING),
        "IsPair",[IsPair],
        "ReportControlCentreNo",[ReportControlCentreNo]
    )
)

问题终于解决。

总结:

在两个无关系的表之间使用NATURALINNERJOIN时,可以通过强制转换它们的同名列数据类型以达到数据兼容的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

张俊林:由ChatGPT反思大语言模型(LLM)的技术精要

ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型&#xff08;LLM,Large Language Model&#xff09;效果能好成这样&#xff1b;惊醒是顿悟到我们对LLM的认知及发展理念&#xff0c;距离世界最先进的想法&#xff0c;差得有点远。我属于既惊喜又惊醒的那一批&a…

Linux进程间通信(管道)

进程间通信的目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件&#xff08;如…

Ubuntu20.04开启VNC远程服务配置教程

对于使用过PVE的大佬来说&#xff0c;在自己电脑安装虚拟机打开的画面惨不忍睹&#xff0c;其实它只是用错了地方。 今天给大家介绍一款控制工具&#xff0c;它叫VNC&#xff0c;是用来进行远程连接的非常好用的工具可以很完美的适配自己电脑的屏幕。显示效果如下&#xff1a;…

【Spark分布式内存计算框架——Spark SQL】3. SparkSQL 概述(下)、DataFrame

2.2 官方定义 SparkSQL模块官方定义&#xff1a;针对结构化数据处理Spark Module模块。 主要包含三层含义&#xff1a; 第一、针对结构化数据处理&#xff0c;属于Spark框架一个部分 结构化数据&#xff1a;一般指数据有固定的 Schema(约束)&#xff0c;例如在用户表中&…

MapReduce paper(2004)-阅读笔记

文章目录前言摘要&#xff08;Abstract)一、引言( Introduction)二、编程模型&#xff08;Programming Model&#xff09;三、实现&#xff08;Implementation&#xff09;3.1、执行概述&#xff08;Execution Overview&#xff09;3.2、主节点数据结构&#xff08;Master Data…

im 应用多点登录和消息漫游架构

本文主要节选和总结自沈剑大佬的 微信多点登录与QQ消息漫游架构随想和文章的评论&#xff0c;略有删改 1、多点登录和消息漫游架构 多点登录指的是同个账号可以在多类终端(安卓、pc)同时登录&#xff0c;但是同类终端只能在唯一的一台设备上登录。 消息漫游指的是服务端保存聊天…

超详细讲解线性表和顺序表!!

超详细讲解线性表和顺序表&#xff01;&#xff01;线性表顺序表顺序表的概念及结构静态顺序表动态顺序表顺序表接口实现1、创建2、初始化3、扩容4、尾插5、打印6、销毁7、尾删8、头插9、头删10、插入任意位置11、删除任意位置12、查找13、修改线性表 线性表&#xff08;linea…

分析C语言位域的访问开销

背景 C语言的位域用于描述结构体的指定字段占多少bit&#xff0c;使得多个字段可以存到一个字节里&#xff0c;也可以让一个字段占多个字节。它能减小结构体的内存占用&#xff0c;同时还能精确限定结构体字段的取值范围。 问题的提出 项目上有个硬件模块&#xff0c;它输入…

Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

本文主要讲四个部分&#xff1a; 1.什么是Yapi 2.Centos7 下基于docker安装Yapi 3.Yapi数据迁移 4.利用Nginx反向代理 什么是Yapi YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、…

网络安全-内网DNS劫持-ettercap

网络安全-内网DNS劫持-ettercap 前言 一&#xff0c;我也是初学者记录的笔记 二&#xff0c;可能有错误的地方&#xff0c;请谨慎 三&#xff0c;欢迎各路大神指教 四&#xff0c;任何文章仅作为学习使用 五&#xff0c;学习网络安全知识请勿适用于违法行为 学习网络安全知识请…

【C++、数据结构】哈希 — 闭散列与哈希桶的模拟实现

文章目录&#x1f4d6; 前言1. STL中哈希表的两个应用⚡1.1 &#x1f31f;unordered_set1.2 &#x1f31f;unordered_map2. 常见查找的性能对比&#x1f4a5;3. 哈希表模拟实现&#x1f3c1;3.1 哈希的概念&#xff1a;3.2 哈希函数&#xff1a;3.3 哈希冲突&#xff1a;3.4 闭…

RPC概念与理解(一)

目录 1.写在前面 2. 电商系统的演变 2.1 单一应用框架 2.2 垂直应用框架 2.3 分布式应用架构(RPC) 2.4 流动计算架构(SOA) 2.5 架构演变详解 3.远程调用方式 RPC Http 总结&#xff1a;对比RPC和http的区别 4.什么是PRC 5.RPC是什么 6.RPC剖析 6.1.RPC的工作原理…

Java并发编程解析之基于JDK源码解析Java领域中ReentrantLock锁的设计思想与实现原理

一、开头 在并发编程领域&#xff0c;有两大核心问题&#xff1a;一个是互斥&#xff0c;即同一时刻只允许一个线程访问共享资源&#xff1b;另一个是同步&#xff0c;即线程之间如何通信、协作。 主要原因是&#xff0c;对于多线程实现实现并发&#xff0c;一直以来&#xff…

【蓝桥杯集训3】二分专题(3 / 5)

目录 二分模板 1460. 我在哪&#xff1f; - 二分答案 哈希表 1221. 四平方和 - 哈希表 / 二分 1、哈希表 2、二分 自定义排序 1227. 分巧克力 - 113. 特殊排序 - 二分模板 l r >> 1 —— 先 r mid 后 l mid1 —— 寻找左边界 —— 找大于某个数的最小值lr…

SRV6跨域优势

背景 运营商网络作为一张覆盖全国的网络&#xff0c;其主体分为骨干&#xff0c;省干&#xff0c;城域网层级&#xff0c;主流的管理模式为分层级管理。随着运营商网络服务的终端规模不断增长&#xff0c;不同地理位置之间网络连接的需求变得非常的普遍&#xff0c;但不同网络…

SpringMVC使用JSTL

简介 JSTL 标签是一个开放源代码的 JSP 标签库&#xff0c;是由 apache 的 jakarta 小组来维护的&#xff1b;JSTL 只能运行在支持 JSP1.2 和Servlet2.3 规范的容器上&#xff0c;在 jsp 页面中经常用到&#xff0c;能帮助我们实现一些特殊的功能&#xff0c;例如&#xff1a;…

windows-Mysql的主从数据库同步设置

复制原有的mysql修改my.ini配置文件 修改端口号修改从数据的地址和从数据库的数据存放地址安装从数据库进入从数据库的bin目录&#xff0c;打开命令窗口输入命令&#xff1a;mysqld.exe install mysql-back --defaults-file "C:\ProgramData\MySQL\MySQL Server 5.7-back\…

1、创建第一个Android项目

1.1、创建Android工程项目&#xff1a;双击打开Android Studio。在菜单栏File中new-->new project3、在界面中选择Empty Activity&#xff0c;然后选择next4、在下面界面中修改工程名称&#xff0c;工程保存路径选择java语言&#xff0c;然后点击finishAndroid studio自动为…

实现了统一消息中心的微服务基础框架 JVS,快点赞收藏

一、开源项目简介基于JVS&#xff08;基于spring cloud封装&#xff09;的基础开源框架&#xff0c;实现了基于多对多租户能力的管理系统。二、基础框架实现功能支持数据管理支持分布式定时任务支持分布式日志采集支持系统监控支持动态配置中心支持模板消息支持链路跟踪支持邮件…

jenkins部署指定任意版本和配置详细教程 jenkins 2.361版本示例

Jenkins构建CI/CD什么是CI/CD&#xff1a;持续集成/持续发布---开发(git) -->git主库-->jenkins(gitjdktomcatmaven打包测试&#xff09;-->发布到tomcat服务器。持续集成(Continuous Integration, CI): 代码合并&#xff0c;构建&#xff0c;部署&#xff0c;测试都在…