PowerBI公式-Earlier函数

2019-08-07 10:43:48 浏览数 (1)

Earlier 函数

这是一个让很多初学者困惑的函数,尤其是看到下面这样的句型。许多人是在学习了DAX很久之后才领悟了Earlier的使用方法,其实我认为有时候我们把它想复杂了。

Earlier = 当前行

我们第一阶段学习的Filter是一个行上下文函数,Earlier也是一个行上下文函数。主观地讲,Earlier这个函数的命名很容易让人困惑,英文直译为“更早”,它的本义是指前面用到的行上下文,基于这个语义的命名没毛病,然而这个概念很抽象,在使用中是很难体会到更早的含义。

所以学习这个公式最好方法是我们先忽略它的命名,把它看做CurrentRow,即Earlier=当前行, 至少99%的应用情况可以这样去理解,相信我,这是入门理解Earlier公式的最快办法。我们现在就来看看是不是这样。

前些日子有一位读者问了我一个关于顺序计数的问题,正好就用它来做个举例说明。下面的表每行都是一位顾客的订单,索引是以时间顺序排序,我们想要添加一列,求每笔订单是该顾客的第几次购买。

不难想到的一个方法是先筛选一张表(使用Filter),筛选条件是与当前行顾客同名字,索引号<=当前行的索引号,再求这张表的行数。有了这个逻辑,可以顺畅地写一个公式。

我们可以更进一步分解Filter这个动作,当走到第7行时,公式中的earlier([顾客名字])就是指当前行的顾客名字,即"李达康"。Filter公式逻辑我们学过,它对表做逐行扫描,第一行"侯亮平"不等于"李达康",排除;第二行,顾客名字是"李达康",所以保留。

以此类推,直至把表中的每一行扫描完,保留所有顾客名字为"李达康"的表。&&指的是同时满足条件,同理,它限定了条件为索引号<=当前索引号,即索引号小于等于7。最后得到3行表,计数为3。

通过这个例子,我想你应该已经明白了Earlier的基本用法,值得强调的是:

Calculate([度量值], Filter('表',[列]=Earlier([列]))

是一个非常好用的句型, 它与索引列结合起来用还可以去关联上一行或上几行。

Calculate([度量值], Filter('表',[索引]=Earlier([索引]-1))

祝好,

0 人点赞