zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

史上最速解决:Power BI由"按列排序"导致的"循环依赖"

2023-04-18 14:54:40 时间

引子

当我们在处理这样的数据时,想要进行排列时,会发现它并没有按照我们预想的按照1……9,10,11,12……这样的排序:

因为文本和数字在一起的列,数字只是文本。如果我们想要按照预想的顺序排列,能做的应该也只有按列排序,因此我们将周数中的数字提取出来作为单独一列:

周数2 = MID([周数],6,10)

再选中[周数]列,点击“按列排序”,选择[周数2],结果发现:

检测到循环依赖关系!

原因分析

因为[周数2]这一列是由[周数]生成的,因此对[周数]进行排序计算时,引擎需要计算按列排序的目标[周数2]这一列的大小以便排序,而在计算[周数2]的时候发现,它是由[周数]计算而来,这就产生了循环依赖。

通俗点讲:循环依赖的产生就是这样,本来要计算A,但是过程中要计算B,而要计算B又需要计算A,就循环起来了。

循环依赖的产生有很多种形式,最常见的就是多个新建列之间经常性由于没有ALL掉合适的列,而导致行上下文转换为筛选上下文导致的循环依赖。

关于这一点后续我会再发文总结,几个常见的循环依赖问题产生的原因以及如何进行避免。

那这个问题该怎么解决呢?

如果是从数据源中直接获取的这个表,那么可以在pq中直接将数字提取出来作为单独一列,这样加载到报告中它们就是相互独立的两列,两者之间并没有依赖关系,也就不会产生循环依赖:

自定义= Table.AddColumn(更改的类型1, "自定义", each Text.Select([周数],{"0".."9"}))

但是这样做有个问题,比如我的数据表很大,我在里面添加一列是会无端地加大数据量的,影响刷新速度,这不是我想要的。

而且,一般情况下,我都是会将周数抽离出来作为单独的一个维度表,这样也可以对其他表进行关联计算:

那这个表是无法在pq里进行处理的。

此时我们应该如何做呢?

办法其实很简单。

解决问题

我们仍然对这个表添加一列[周数2]:

刚才我们说过,[周数]对[周数2]按列排序是会导致循环依赖的。但是如果我再根据[周数]添加一列新列,它和[周数2]是否还存在循环依赖关系呢?大家可以思考一下:

[周数2]和[周数3]之间有关系吗?这两列都是由[周数]计算得来,但是这两列本身并不存在什么直接关联。

实践是检验真理的唯一标准,我们测试一下:

没有问题。

结论

当遇到因为按列排序而导致的循环依赖问题,可以再新建复制一列想要排序的列,这样两个都是由原列计算而来的列直接并没有直接关系,也就不存在循环依赖,因此可以放心地进行按列排序。

虽然会造成数据的重复,但是毕竟是维度表,数据量很小,虽然有所重复,但影响不大。

而且,理论上应该也是解决问题最快的办法。

你学会了吗?