DAX:跟关系相关的函数

在表格数据模型中,用户可以创建关系,并可以沿着关系的方向自动进行交叉过滤。但是在 计算列中,必须通过RELATED 和 RELATEDTABLE函数来检索相关联的表。当使用CALCULATE函数时,可以直接使用现有的活跃关系来进行过滤,并不需要显示调用RELATED 和 RELATEDTABLE函数来利用关系。

一,RELATED函数和RELATEDTABLE 函数

RELATED 和 RELATEDTABLE函数作用于行上下文中,常用于 计算列和迭代函数中。在行上下文中,通过RELATED 和 RELATEDTABLE函数获取相关联表中得数据。

从关系的角度,这两个函数的区别是:

  • 在一对多的关系中,RELATED 用于从”多”端访问”一”端,在这种情况下,相关表中至多有一行。如果数据行不存在,那么RELATED 函数返回BLANK。
  • 如果希望从关系的”一”端访问到”多”端,就需要使用RELATEDTABLE 函数,在这种情况下,相关表中可能有多行,RELATEDTABLE 返回一个表,表中包含所有与当前行相关联的其他表的所有行。

另外一个区别是返回值类型的不同,RELATED返回的是标量值,而RELATEDTABLE 返回的是表。

RELATED 和 RELATEDTABLE函数可以贯穿一条长长的关系链,跟关系的长度(或步数)无关。对关系的唯一限制是:所有关系都需要具有相同的类型(即一对多或对一),并且关系都朝着相同的方向。

1,RELATED函数

函数RELATED通过关系的多端,从其他表中返回一个或0个值,该值跟当前数据行有关系,该函数不受任何过滤器的影响:

RELATED()

使用函数RELATED的前提是:当前表和关系表之间存在关系,关系有多少步不重要的,只要可以过滤到。

当RELATED执行查找(lookup)时,它会检查所有值,而忽略所有的过滤器。

RELATED函数需要行上下文(row context),因此,RELATED函数只能用于计算列表达式中。

RELATED函数需要当前表和关联表之间存在关系,在函数中指定包含你需要数据的列,该函数遵循现有的多对一关系,以从相关表的指定列中获取一个值,也就是说,RELATED函数从多方关联到1方的一个值,参数column是1方表中的列。当RELATED函数执行查找时,它会检查指定表中的所有值,而不管可能已应用的任何过滤器。

注意:RELATED函数需要行上下文,因此,只能用于计算列表达式中(其当前行上下文是明确的) 和表扫描函数中。表扫描函数(如SUMX)获取当前行的值,然后扫描关联表以查找指定列的关联值。

例如,从下图中可以看到,FactSales和DimProduct之间存在 “*对1”的关系,并且FactSales是多方,DimProduct是1方。可以在RELATED()函数中指定DimProduct表中的列,以从DimProduct表获得跟FactSales中某一行相关联的值。

DAX:跟关系相关的函数

在FactSales表中创建计算列,获取跟当前行相关的产品颜色的值:

Related_color = RELATED( DimProduct[Color])

举个例子,Sales 和 Product 之间有多对一的关系,Product 和 Product Category之间有多对一的关系,那么可以在Sales表中创建一个计算列,根据 Product Category来调整值。

Sales[AdjustedCost] = IF (
            RELATED( 'Product Category'[Category] = "Cell Phone")
            , Sales[UnitCost] * 0.95,
            , Sales[UnitCost]
)

2,RELATEDTABLE 函数

RELATEDTABLE 函数通过关系的一端,从其他表中返回由一行或多行构成的表,表中包含所有与当前行相关联的其他表的所有行。

RELATEDTABLE()

RELATEDTABLE 函数收到过滤上下文的影响,在当前的过滤上下文中,返回相关联的数据行构成的表,RELATEDTABLE 函数相当于没有过滤条件的CALCULATETABLE函数:

CALCULATETABLE()

RELATEDTABLE 函数不仅可以用于计算列中,还可以用于迭代函数中。

二,USERELATIONSHIP 函数

由于PowerBI的数据模型的限制,虽然两个表之间可以创建多个关系,但是只能有一个活跃的关系,其他关系是非活跃的。在一个确定的时间点,任何两个表之间只能激活一个关系,因此,对于两个表之间的关系,USERELATIONSHIP在激活一个关系的同时,会禁用其他关系。

在使用Calculate函数设置筛选上下文时,可以使用USERELATIONSHIP函数,在Calculate函数的上下文中启用非活跃的关系。

USERELATIONSHIP(,)

USERELATIONSHIP函数只能启用已有的关系,通过两个表之间的字段来确定关系。USERELATIONSHIP函数不返回任何值,只是启用关系,举个例子:

= CALCULATE(SUM(InternetSales[SalesAmount]), USERELATIONSHIP(InternetSales[ShippingDate], DateTime[Date]))

三,CROSSFILTER 函数

对于已经存在的关系,通过CROSSFILTER函数指定交叉过滤(cross-filter)的方向,

CROSSFILTER(, , )

参数direction 有4个可用值:

  • None :禁用关系
  • Both :设置交叉过滤的方向为双向
  • OneWay_LeftFiltersRight:设置交叉过滤的方向为单向,
  • OneWay_RightFiltersLeft:设置交叉过滤的方向为单向,

CROSSFILTER 函数的注意事项:

  • CROSSFILTER函数只能用于数据模型中已经存在的关系。
  • 在Calculate等函数的上下文,CROSSFILTER函数会覆盖在数据模型中设置的关系的cross-filter的方向。
  • 如果CALCULATE 嵌套,并且多个 CALCULATE 表达式包含 CROSSFILTER 函数,那么最内层的CROSSFILTER 是在发生冲突或歧义时优先级最高。

参考文档:

Relationship functions

Original: https://www.cnblogs.com/ljhdo/p/14442765.html
Author: 悦光阴
Title: DAX:跟关系相关的函数

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/552514/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python 常用模块简析

    random.choices(population,weights=None,*,cum_weights=None,k=1):从指定序列中随机抽取k次数据,返回一个列表,可以设置权…

    技术杂谈 2023年6月21日
    075
  • 《插秧诗》契此和尚

    《插秧诗》契此和尚 手把青秧插满田,低头便见水中天。 六根清净方为道,退步原来是向前。 posted @2022-08-04 09:17 郑瀚Andrew 阅读(152 ) 评论(…

    技术杂谈 2023年5月31日
    084
  • c#常用快捷键

    相信.Net开发人员都想能够熟记各种VS快捷键以提高平时开发的效率,但苦于记忆能力太差而快捷键又特别多,特别烦,所以作罢! 下面我将简单介绍一下我记忆VS快捷键的一些方法,希望对大…

    技术杂谈 2023年7月24日
    067
  • 【SSM框架】SpringMVC笔记 – 汇总

    1、什么是 SpringMVC? SpringMVC 是基于 MVC 开发模式的框架,用来优化控制器。它是 Spring 家族的一员,它也具备 IOC 和 AOP。 什么是MVC?…

    技术杂谈 2023年7月10日
    095
  • Newtonsoft.Json 用法

    忽略某些属性 默认值的处理 空值的处理 支持非公共成员 日期处理 自定义序列化的字段名称 动态决定属性是否序列化 枚举值的自定义格式化问题 自定义类型转换 全局序列化设置 1.忽略…

    技术杂谈 2023年6月1日
    081
  • Jwt新手入门教程

    Jwt的新手入门教程 1.Jwt究竟是什么东东? ​ 先贴官网地址:JSON Web Tokens – jwt.io ​ ​ 再贴官方的定义: What is JSON…

    技术杂谈 2023年6月21日
    088
  • Windows+VSCode编译在Linux-x86_64环境上运行的程序

    一、简介 本文主要介绍在Windows平台上使用VSCode,从而可以一键编译出运行在Linux-x86_64环境中的程序或库。 二、实现方式 ① 交叉编译 ② WSL(Windo…

    技术杂谈 2023年7月24日
    052
  • Kubernetes 零宕机发布设置

    POD Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元,每个Pod包含了一个pause容器,pause容器时Pod的父容器,负责僵尸进程的回收管理,…

    技术杂谈 2023年7月11日
    069
  • weditor 0.6.5版本安装报 ‘gbk’ codec can’t decode byte 0xad in position

    pip安装或者更新 weditor到最新的0.6.5版本时会报错,如下: 解决办法: 设置环境变量,在命令窗口中执行: 然后再次执行pip install weditor==0.6…

    技术杂谈 2023年7月11日
    071
  • FlinkSQL 之乱序问题

    乱序问题 在业务编写 FlinkSQL 时, 非常常见的就是乱序相关问题, 在出现问题时,非常难以排查,且无法稳定复现,这样无论是业务方,还是平台方,都处于一种非常尴尬的地步。 在…

    技术杂谈 2023年6月21日
    078
  • [转帖][转]五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年5月30日
    091
  • Go异步check简单示例

    异步check代码: 测试: Original: https://www.cnblogs.com/-wenli/p/14737981.htmlAuthor: stdTitle: G…

    技术杂谈 2023年5月31日
    082
  • Django同时支持http/https(转载)

    声明著作权:Django同时支持http/https – Alita的文章 – 知乎 https://zhuanlan.zhihu.com/p/385440…

    技术杂谈 2023年7月10日
    083
  • 基于结构的数据同步

    基于结构的数据同步 可用于异构平台间的数据同步。 一个是支持跨语言,结构使用google protocol定义。二个是支持JSON和GOOGLE PROTOBUF二种序列。 1)代…

    技术杂谈 2023年5月31日
    089
  • SpringMVC 使用注解时路径找不到

    SpringMVC 注解路径找不到 今天在使用SpringMVC时偶然遇到了跳转 404 的问题,于是决定记录下来 启动后输入 @RequestMapping(“/lo…

    技术杂谈 2023年7月11日
    061
  • HBase1.4.6安装搭建及shell命令使用

    HBase1.4.6安装搭建 HBase1.4.6安装搭建 一、前期准备(Hadoop,zookeeper,jdk) 搭建Hbase 1、上传解压 2、配置环境变量 3、修改hba…

    技术杂谈 2023年7月11日
    070
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球