DAX度量以在一年的滑动窗口内通过新购买来计算客户百分比



我需要一项措施,这将使我在上次购买后一年内进行新购买的客户百分比。

通常,我只会创建一个计算出的列,该列捕获了每个客户每年最后购买日期总结一下,但是我正在使用与立方体的实时连接,无法创建计算的列。

这是我要寻找的一些伪代码:

One Year Return =
VAR Cohort =
SUMMARIZECOLUMNS (
    Customer[ID],
    FILTER (
        VALUES ( Sales[Sales Date] ),
        YEAR ( Sales[Sales Date] )
            < ( YEAR ( TODAY () ) - 1 )
    )
)
VAR Returners =
SUMMARIZECOLUMNS (
    Customer[ID],
    FILTER (
        VALUES ( Sales[Sales Date] ),
        Sales[Sales Date] > Sales[Old Sales Date]  //<--Need help here 
    ),
    FILTER (
        VALUES ( Customer[ID] ),
        Customer[ID] IN Cohort
    )
)
VAR Rate =
CALCULATE ( DISTINCTCOUNT ( Customer[ID] ), Customer[ID] IN Returners ) /
CALCULATE ( DISTINCTCOUNT ( Customer[ID] ), Customer[ID] IN Cohort )
RETURN
    Rate

主要困难是我需要每个客户一个不同的时间窗口,但不能制作计算的列。我一直在考虑使用较早的或ParallelPeriod之间的使用,但无法让它们中的任何一个工作。

首先,我认为您正在寻找此

VAR last_year = DATE ( YEAR ( TODAY () ) - 1; MONTH ( TODAY () ); DAY ( TODAY () ) )

第二。完成此操作的最佳方法您需要一些数据建模。使时间情报工作的唯一方法是拥有一个日期表。该桌子应该在不丢失的情况下每天都有一排。您可以在线搜索如何创建一个或在此处查看我的博客。一旦将此表带入模型上的情况表,您将能够在选定的日期构建该量度。选定的值将是一个值和去年的值。

关键是您需要在没有计算列的情况下为每个客户进行比较。使用Countx或Sumx之类的迭代器可以使用。这使您能够通过"同类"子桌子中的客户循环循环,并通过使用当前迭代中的客户ID来创建销售表的选择,以使用较早的使用者来过滤您的销售表。对于队列中的每个客户,您然后选择他们的最后购买日期,以及在此之前的购买日期,并比较两者,以查看他们是否在一年内遵循。

在dax中看起来有些复杂,但我试图使其具有间隔剂,因此更容易遵循。它还包含一点解决方法,因为您不能简单地循环浏览_ the the the chocor varible,因为在这种情况下,您无法访问当前迭代中的客户ID

One year return = 
    var _now = TODAY()
    var _cohort = 
        SUMMARIZECOLUMNS (
            Sales[CustomerID] ;
            FILTER ( 
                Sales ; 
                DATEDIFF( Sales[SalesDate] ; _now ; YEAR ) <= 1 
            )
        )
    var _countCohort = COUNTROWS( _cohort )
    var _countReturns =
        SUMX (
            SUMMARIZECOLUMNS (
                Sales[CustomerID] ; FILTER ( Sales ; Sales[CustomerID] IN _cohort )
            ) ; 
            var _lastPurchase = 
                CALCULATE ( 
                    MAX ( Sales[SalesDate] ) ;
                    ALLSELECTED ( Sales ) ;
                    Sales[CustomerID] = EARLIER( Sales[CustomerID] )
                )
            var _preLastPurchase = 
                CALCULATE ( 
                    MAX ( Sales[SalesDate] ) ;
                    ALLSELECTED ( Sales ) ;
                    Sales[SalesDate] < _lastPurchase ;
                    Sales[CustomerID] = EARLIER( Sales[CustomerID] )
                )
            RETURN
                IF ( DATEDIFF( _preLastPurchase ; _lastPurchase ; YEAR ) <= 1 ; 1 ; 0 )
        )

RETURN
    _countReturns / _countCohort

我最终从多维数据集导入数据集并创建计算出的列以使我到达那里。@jelle-hoekstra的答案看起来接近我最终的工作,但我不知道如何让他的措施运行。

我制作了三个计算的列,并对returncustomerid列进行了明显的计数,以获取上一次购买后一年内返回的客户数量:

Last Purchase Date = 
MINX (
    FILTER (
        Sales,
        Sales[Sales Year]+1 = EARLIER ( Sales[Sales Year] ) &&  Sales[CustomerID] = EARLIER ( Sales[CustomerID] )
    ), 
    MAXX (
        FILTER (
            Sales,
            Sales[Sales Year] = EARLIER ( Sales[Sales Year] ) && Sales[CustomerID] = EARLIER ( Sales[CustomerID] )
        ),
        Sales[Sales Date]
    )
)

One Year Date = 
MINX (
    FILTER (
        Sales,
        Sales[Sales Year]+1 = EARLIER ( Sales[Sales Year] ) && Sales[CustomerID] = EARLIER ( Sales[CustomerID] )
    ), 
    MAXX (
        FILTER (
            Sales,
            Sales[Sales Year] = EARLIER ( Sales[Sales Year] ) && Sales[CustomerID] = EARLIER ( Sales[CustomerID] )
        ), 
        EDATE (Sales[Sales Date], 12 )
    )
)

ReturnCustomerID = 
IF (
    Sales[Sales Date] > Sales[Last Purchase Date] && Sales[Sales Date] < Sales[One Year Date], Sales[CustomerID], BLANK()
)

最新更新