首页 > 解决方案 > 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

主要困难是我需要为每个客户设置不同的时间窗口,但无法制作计算列。我一直在考虑使用 EARLIER 或 DATESBETWEEN 或 PARALLELPERIOD,但到目前为止还没有让它们中的任何一个工作。

标签: powerbidax

解决方案


关键在于,您需要在没有计算列的情况下对每个客户进行比较。可以通过使用 COUNTX 或 SUMX 之类的迭代器来实现。这使您能够遍历同类群组子表中的客户,并通过使用当前迭代中的客户 ID 创建销售表的选择,以使用 EARLIER 过滤您的销售表。然后,对于群组中的每个客户,您可以选择他们的最后购买日期和之前的购买日期,然后比较这两个日期,看看他们是否在一年内跟进。

在 DAX 中,它看起来有点复杂,但我试图让它更宽敞,以便更容易理解。它还包含一些解决方法,即您不能简单地循环 _cohort 变量,因为在这种情况下,您将无法在当前迭代中访问客户 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

推荐阅读