如何通过两个属性有效地获取唯一的前一行?

时间:2014-11-18 14:38:05

标签: excel excel-formula powerpivot powerbi

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

从SQL的角度来看,我只是做一个内连接,其中ACTIVITY =连接ACTIVITY和ID = ID - 1在连接表中并得到我需要的行。

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

因此,使用前一个post中的答案,我能够获得1000行所需的结果。但是,如果我要将此行数增加到85000+,则此功能非常慢。

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

我的最终结果是将此功能设置为多达700万行,如果可行,我该如何优化它?如果不是,你能解释一下为什么我不能这样做吗?

Fetching previous rows with the same ID and Activity

3 个答案:

答案 0 :(得分:3)

一种选择可能是尝试对方法进行修改 - 没有您的数据集我无法测试它是否更有效但我在1m +行数据集上运行类似的东西没有问题:

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

可能不是你想听到的,但在导入时使用SQL执行此操作可能是你最好的选择。

答案 1 :(得分:2)

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

看起来像是:

=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)
            )
     )

答案 2 :(得分:2)

<强> JShmay

这几乎是同一个问题 - 正如Jacob建议的那样,你可以使用Excel / PowerPivot中通常可用的logical operators

你真的可以为此疯狂,如果你需要更复杂的东西 - 例如在其他条件之后得到两点之间的差异,我会指出非常相似的问题和我对它们的回答:

希望这会有所帮助:)