提高DAX代码效率 - 计算重叠日期范围内的唯一开始日期

时间:2018-01-19 00:12:35

标签: time count dax

我有一张桌子,列出了每位客户25年来购买的每件产品。该表包含客户端#,产品,开始日期和结束日期。 产品可由客户拥有任何时间(1天至100年)。当客户与我们拥有产品时,客户端是活跃的。如果客户结束所有产品,他们就不再是客户。我想计算每年新客户的开始数。问题是,一些客户终止所有产品然后在几年后再次开始购买产品(但客户总是保留相同的客户#) - 如果客户离开然后重新加入一年后我想将客户端计为新客户。

我已经创建了DAX代码,可以在一个小文件上完美地运行,但是代码占用了太多资源,所以我不能在我的数据上使用它(大约200,000条记录)。我知道我的代码非常缺乏,可能会被清理......但我不确定如何。或者,如果我能弄清楚如何在PowerQuery中创建这些列,那么可能会有效

我是这样做的。

1)向我的表中添加四个计算列:

VeryFirstStart = Calculate(Min('Products'[StartDate]),ALLEXCEPT(Products,Products [ClientNumber]))=产品[StartDate]

此标记包含任何客户端

的首个开始日期的记录

MaxEndDateofEarlierDates =计算(最大值('产品'[EndDate]),过滤器(过滤器(ALLEXCEPT(产品,产品[ClientNumber]),产品[EndDate]),产品[StartDate]

此步骤炸毁我的PowerBI - 显示任何新产品购买的日期,其中新的开始日期发生在结束日期之后

Second + Start = And(Products [MaxEndDateofEarlierDates]<> BLANK(),Products [MaxEndDateofEarlierDates]

此标记记录我们要将新开始日期计为新客户的位置

NewStart = OR(产品[Second + Start],Products [VeryFirstStart])

**此标记任何新的客户端开始日期,无论是第一个还是后续的*

最后我添加了这个措施:

!MemberNewStarts = CALCULATE(DISTINCTCOUNT(Products [ClientNumber]),FILTER('Products',('Products'[StartDate]< = LASTDATE('DIMDate'[Date]) &安培;&安培; '产品'[StartDate]> = FIRSTDATE('DIMDate'[Date])&&产品[NEWSTART] = TRUE())))

有没有人对如何用更少的资源实现这一目标有任何建议?

由于

以下是一些要尝试的数据 MemberNumber产品StartDate EndDate注释(不在实际数据中) 1 A 02/02/2003 02/02/2004
1 C 02/02/2009 02/02/2010
2 A 02/02/2001 02/02/2002
2 C 02/02/2001 02/02/2002
2 B 02/02/2005 02/02/2010
3 C 02/02/2002 02/02/2005
3 B 02/02/2002 02/02/2005
3 A 02/02/2003 02/02/2008
4 B 02/02/2002 02/02/2003
4 C 02/02/2003 02/02/2006
5 B 02/02/2003 02/02/2007
5 C 02/02/2005 02/02/2010
5 A 02/02/2005 02/02/2007
6 A 02/02/2001 02/02/2006
6 C 02/02/2003 02/02/2007
7 B 02/02/2001 02/02/2004
7 A 02/02/2001 02/02/2005
7 C 02/02/2005 02/02/2006
8 B 02/02/2002 02/02/2006
8 A 02/02/2004 02/02/2009

注意成员1在2009年作为新客户开始,因为所有以前的产品在2004年结束,成员2在2005年作为新客户开始,因为所有以前的产品在2002年结束

期望的结果是: 开始年份2001 2002 2003 2004 2005 2006 2007 2008 新客户3 3 2 0 1 0 0 0

1 个答案:

答案 0 :(得分:0)

这是尝试解决问题的一种方法。如果这比你的更有效,请告诉我:

第一个新专栏:

PreviousHighestFinish:=  
    Calculate(
              Max(Products[EndDate]),
              ALLEXCEPT(Products,Products[ClientNumber]),
              Products[StartDate] < Earlier(Products[StartDate]
             )

这将为您提供客户编号匹配且开始日期早于当前开始日期的最新结束日期。如果没有较早的开始日期,则返回空白。

第二个新专栏:

NewClientProduct:=
      if(Products[StartDate]>=Products[PreviousHighestFinish],1,0)

对于之前未见过客户端的每一行(前一列显示为空白)或客户端之前已经看过,但是没有当前产品,这将为您提供1。

此措施的问题在于,如果您的客户在同一天启动了多个产品,则会显示为多个新客户。

对此的修复是计算每个客户 - 日期组合的实例

第3个新专栏:

ClientDateCount:=
    CALCULATE(
        COUNTROWS(Products),
        ALLEXCEPT(Products,Products[ClientNumber],Products[StartDate])
             )

这实质上给出了表中此行上的客户端在此日期启动产品的次数。

现在将第二个新列除以此

第4个新专栏:

NewClients:=
    DIVIDE(Products[NewClientProduct],Products[ClientDateCount])

瞧:

enter image description here