PowerBI/DAX之理解VALUES与DISTINCT

本篇文章将介绍VALUES与DISTINCT这两个函数的使用与注意事项,它们都属于DAX的核心函数,因此这两个函数的每一处细节最好都要掌握。


先来看一下本篇文章要用到的数据与数据模型,如下图所示:


VALUES函数的用法

VALUES可以说是使用频率最高的一个表函数了,因为它能以返回表的方式来引用列。当你想将列作为表来使用时,只需要在所使用的列的外面套上一个VALUES,问题就可以迎刃而解。VALUES的语法结构如下:

语法:

VALUES ( <TableName> | <ColumnName> )

作用:

VALUES将其参数在数据模型中的可见值以表的形式返回,它的参数可以是列,也可以是表,具体如下:

1、若参数为列时,VALUES返回该列的所有可见值去重后形成的单列表;

2、若参数为表时,VALUES返回该表的所有可见值,并且保留重复行。其中,作为参数的表只能是基础表,不能是返回表的表达式。

VALUES函数比较简单,我们只需要记住,当它的参数为列时会去重,而参数为表的时候不会去重就可以了。由于其参数为表时不会去重,那么就跟直接引用基础表时的效果一致,因此一般我们都只使用VALUES函数来引用列。此外,无论VALUES函数的参数是列还是表,它都是返回的可见值,即需要考虑外部筛选上下文的影响。

下面来看一些帮助理解的例子,由于VALUES函数是表函数,为了方便起见就以查询来演示。具体如下图:

VALUES是一个表函数,它返回的是一个表,但在DAX中,单行单列的表可以被当作标量值来使用。下面就以VALUES函数来演示一下这种特性,具体如下图:


DISTINCT函数的用法

DISTINCT的功能与VALUES基本一致,仅在某些情况下具有不同的表现。DISTINCT的语法结构如下:

语法:

DISTINCT ( <TableName> | <ColumnName> )

作用:

DISTINCT将其参数在数据模型中的可见值以表的形式返回,它的参数可以是列,也可以是表,具体如下:

1、若参数为列时,DISTINCT返回该列的所有可见值去重后形成的单列表;

2、若参数为表时,DISTINCT返回该表的所有可见值,并以行为单位去重。其中,作为参数的表可以是基础表或者是返回表的表达式。

可以参照下图来理解DISTINCT的用法:


VALUES与DISTINCT的区别

VALUES与DISTINCT的区别主要有三个,具体如下:

1、VALUES的参数若为表时,只能是基础表。而DISTINCT的参数若为表时,可以是基础表或者是返回表的表函数;

2、VALUES的参数若为表时,保留重复行。而DISTINCT的参数若为表时,则会对重复行去重;

3、当遇到由参照完整性不匹配而产生的空行时,VALUES会处理空行而DISTINCT则不会处理空行,也就是说VALUES会返回由参照完整性不匹配而产生的空行,而DISTINCT则不会返回由参照完整性不匹配而产生的空行。

下面对第三点的区别做一个详细说明,使用到的度量值表达式如下:

商品表行数 = COUNTROWS('商品表')

values 商品编码 = COUNTROWS(VALUES('商品表'[商品编码]))

distinct 商品编码 = COUNTROWS(DISTINCT('商品表'[商品编码]))

values 商品售价 = COUNTROWS(VALUES('商品表'[售价]))

distinct 商品售价 = COUNTROWS(DISTINCT('商品表'[售价]))

利用上面的度量值来求解商品表的行数,通过对比它们行数之间的差异,就可以观察到VALUES与DISTINCT在处理由参照完整性不匹配而产生的空行时所采取的不同行为。

在看结果之前,再来看看我们的数据:

可以看到,在销售表里有一个被标红了的商品编码(A05),这个商品编码在商品表中是不存在的,因此在这里就存在着参照完整性不匹配的情况,所以DAX引擎会在上级表,也就是在商品表里增加一个空白行来对应那些不匹配的销售记录。此外,在商品表里洗衣机的售价为空,这并不代表着没有意义,而代表着它的值就是空。可能有点拗口,但是请记住商品表里有个售价为空的情况,这个空值与空行的空值是不一样的。

新建一个矩阵,把商品表的商品名称列放入行字段,并把上面的度量值全部放入值字段中,结果如下:

可以看到,有一个完全空白的行标签,这个行标签对应着的就是那些在下级表里的不匹配行。观察VALUES与DISTINCT在商品编码这一列上返回的行数就可以看到它们之间行为的不同,这个例子充分说明了VALUES会返回由参照完整性不匹配而产生的空行,而DISTINCT则不会。

然后,再来观察VALUES与DISTINCT在商品售价这一列上返回的行数。可以看到,VALUES在空白行标签下的值还是为1,也就是说VALUES返回了由参照完整性不匹配而产生的空行,但是VALUES在总计行的值却是4而不是5。造成这个现象的原因就是因为商品售价那一列上有空值,而VALUES也返回了由参照完整性不匹配而产生的空行,也就是说VALUES返回了两个空值,但因为VALUES的参数为列时是会去重的,所以就相当于将两个空值合并为了一个,也可以说是删除了一个空值,因此总计行的结果为4而不是5。

看到这里,可能有人会简单的以为VALUES会返回空值而DISTINCT则不会返回空值,这个理解是错误的。VALUES与DISTINCT是否返回空值,取决于这个空值属于谁,如果这个空值是属于参照完整性不匹配而产生的空行,那么VALUES会返回这个空值,而DISTINCT则不会。但如果说空值是属于已存在的数据的某列上,那么这个空值无论是VALUES还是DISTINCT都会返回。想要证明也很简单,只需要把下级表的不匹配数据删掉,也就是把上面所给出的销售表的不匹配记录删掉,再刷新就可以看到结果:

在商品售价这一列上是有一个空值的,但无论是VALUES还是DISTINCT都返回了相同且正确的数值,这足以说明数据里的空值与参照完整性不匹配而产生的空值是不一样的。


VALUES与DISTINCT都是使用频率非常高的表函数,它们的作用与接受的参数都可以说是基本一致,但却不是完全一样。两个函数都有各自的特点,又因为使用频率高,若不彻底理解的话很有可能就会出错或混用。建议看完这篇文章后亲自去测试一下,以更好的理解它们之间的差异。

内容概要:本文详细探讨了机组组合优化模型的构建,旨在通过合理安排各类发电机组的启停计划和优化出力分配,实现电力系统在经济性和稳定性上的最佳平衡。文章首先介绍了电力系统的四大主要组件——传统火电机组、风电机组、光伏机组和储能系统的参数及运行特性。接着,围绕最小化系统总运行成本这一目标,设计了优化目标函数,并明确了包括功率平衡约束、机组出力上下限约束、风光发电功率约束、弃风弃光约束、爬坡速率约束、储能系统荷电状态约束、充放电功率约束和充放电互斥约束在内的多项约束条件。最后,文章列出了求解机组组合优化模型所需的关键变量,如传统机组的开停状态、机组出力、启停成本、风电光伏实际出力、弃风弃光比例及储能系统的充放电功率和荷电状态,以实现系统的经济调度和可再生能源的最大化利用。 适合人群:从事电力系统研究、规划和调度工作的工程师和技术人员,以及对电力系统优化感兴趣的科研人员。 使用场景及目标:①帮助电力系统工程师理解不同类型发电机组的特点及其对系统稳定性、经济性和环保性的影响;②为制定合理的电力系统调度策略提供理论依据和技术支持;③促进可再生能源的有效整合,提高电力系统的灵活性和可靠性。 其他说明:本文提供的模型和方法不仅适用于当前的电力系统,也可为未来含高比例可再生能源接入的电力系统提供参考。文中涉及的具体数学公式和参数设定为实际应用提供了详细的指导,有助于提升电力系统的运行效率和经济效益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值