如何有效地获取通过两个属性独特的早期行?

以前 ,我问过我们如何通过递增的ID字段获取简单的前一行(谢谢PetrHavlík)。 在这种情况下,我有ID和ACTIVITY,其中(ACTIVITY&ID)是每行的唯一值。

从SQL的angular度来看,我只是在ACTIVITY = ACTIVITY和ID = ID – 1的连接表中进行一个内部连接,并获得我需要的行。

换句话说,我想要以前的百分比属于同一个活动。

所以使用上一篇文章中的答案,我可以得到1000行的结果。 但是,如果我要增加这个行数到85000+这个function是令人生畏的缓慢。

= SUMX(FILTER(Query,(EARLIER([ID])= [ID] + 1)&&(EARLIER([ACTIVITY])= [ACTIVITY])),[PERCENTAGE])

我的最终结果是使这个function在700万行,如果这是可能的,我怎么可以优化它? 如果不是,你能向我解释为什么我不能这样做吗?

使用相同的ID和Activity获取前面的行

一种select可能是尝试一种方法的变化 – 没有你的数据集我不能testing它是否更有效,但我已经在1m +行数据集上运行类似的东西没有问题:

= CALCULATE ( SUM ( [PERCENTAGE] ), FILTER ( Query, [ID] = EARLIER ( [ID] ) - 1 && [ACTIVITY] = EARLIER ( [ACTIVITY] ) ) ) 

可能不是你想听到的,但是在导入SQL的时候这样做可能是你最好的select。

这里最好的答案是使用Lookupvalue,它会绕过你需要做的任何filter,并允许你直接查询表中的值。 这会更快。

它看起来像这样:

 =LOOKUPVALUE(table[PERCENTAGE], [ID] = EARLIER ( [ID] ) - 1) 

请确保ID值是唯一的,因为lookupvalue只能返回单个结果,当多于一行返回时,它将会出错。 你可以用iserror来包装它

 = IF(ISERROR(LOOKUPVALUE(table[PERCENTAGE], [ID] = EARLIER ( [ID] ) - 1)), BLANK() , LOOKUPVALUE(table[PERCENTAGE], [ID] = EARLIER ( [ID] ) - 1) ) ) 

JShmay

这是几乎相同的问题 – 正如Jacob所build议的那样,您可以使用通常在Excel / PowerPivot中可用的逻辑运算符 。

你真的可以为此而疯狂,如果你需要更复杂的东西 – 例如,在其他条件下得到两点之间的差异,我会指出你非常类似的问题和我的答案:

  • 我可以比较PowerPivot中相邻行中同一列中的值吗?
  • 第二次最新date – DAX

希望这可以帮助 :)