Powerbi DAX测量用于计算一年内新购买的客户百分比滑动窗口

Powerbi DAX测量用于计算一年内新购买的客户百分比滑动窗口,powerbi,dax,Powerbi,Dax,我需要一个指标,可以给我一个日历年中在上次购买后一年内有新购买的客户的百分比 通常我只会创建一个计算列,捕获每个客户每年最后一次购买的日期,然后检查给定年份的每个客户在其各自的最后一次购买日期后的一年内是否有任何购买,然后将其相加,但我使用的是多维数据集的实时连接,无法创建计算列 下面是我正在寻找的一些伪代码: One Year Return = VAR Cohort = SUMMARIZECOLUMNS ( Customer[ID], FILTER ( VALU

我需要一个指标,可以给我一个日历年中在上次购买后一年内有新购买的客户的百分比

通常我只会创建一个计算列,捕获每个客户每年最后一次购买的日期,然后检查给定年份的每个客户在其各自的最后一次购买日期后的一年内是否有任何购买,然后将其相加,但我使用的是多维数据集的实时连接,无法创建计算列

下面是我正在寻找的一些伪代码:

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
一年申报表=
风险值队列=
生态柱概述(
客户[ID],
滤器(
价值(销售[销售日期]),
年份(销售[销售日期])
<(年份(今天())-1)
)
)
VAR返回器=
生态柱概述(
客户[ID],
滤器(
价值(销售[销售日期]),

销售[销售日期]>销售[旧销售日期]/首先,我想您正在寻找这个

VAR last_year = DATE ( YEAR ( TODAY () ) - 1; MONTH ( TODAY () ); DAY ( TODAY () ) )
第二,完成这项工作的最佳方法是你需要一点数据建模。让时间智能发挥作用的唯一方法是有一个日期表。这个表应该有一个逐日的行,而不缺少天数。你可以在线搜索如何创建一个或查看我的博客。
一旦您将此表与事实表在模型上进行了关联,您就可以在选定日期构建该度量。选定日期将是一个值,而选定值的最后一年将是另一个值。

首先,我想您正在寻找此度量值

VAR last_year = DATE ( YEAR ( TODAY () ) - 1; MONTH ( TODAY () ); DAY ( TODAY () ) )
第二,完成这项工作的最佳方法是你需要一点数据建模。让时间智能发挥作用的唯一方法是有一个日期表。这个表应该有一个逐日的行,而不缺少天数。你可以在线搜索如何创建一个或查看我的博客。
一旦将此表与事实数据表在模型上进行了关联,您就可以在选定日期构建该度量值。选定日期将是一个值,而选定值的最后一年将是另一个值。

关键在于,您需要在没有计算列的情况下对每个客户进行比较。可以使用迭代器与COUNTX或SUMX类似。这使您能够在队列子表中循环浏览客户,并通过使用当前迭代中的客户ID来筛选销售表,从而创建销售表的选择。然后,对于队列中的每个客户,您可以选择其上一次购买日期和之前的购买日期,并将两者与s进行比较ee,如果他们在一年内跟进

在DAX中,它看起来有点复杂,但我试图使它更简洁,以便更容易理解。它还包含一个小的变通方法,用于解决您不能简单地循环使用_队列变量的问题,因为在这种情况下,在当前迭代中您将无法访问客户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
1年回报=
var_now=TODAY()
var_队列=
生态柱概述(
销售[客户ID];
过滤器(
出售;

DATEDIFF(销售[销售日期];_now;年)关键在于,您需要在没有计算列的情况下对每个客户进行比较。可以使用类似COUNTX或SUMX的迭代器进行比较。这使您能够在队列子表中遍历客户,并通过使用当前迭代中的客户ID筛选销售选项卡来创建销售表的选择le更早使用。对于队列中的每个客户,然后选择他们的最后购买日期和之前的购买日期,并比较这两个日期,看看他们是否在一年内遵循

在DAX中,它看起来有点复杂,但我试图使它更简洁,以便更容易理解。它还包含一个小的变通方法,用于解决您不能简单地循环使用_队列变量的问题,因为在这种情况下,在当前迭代中您将无法访问客户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
1年回报=
var_now=TODAY()
var_队列=
生态柱概述(
销售[客户ID];
过滤器(
出售;

DATEDIFF(Sales[SalesDate];_now;YEAR)我最终从多维数据集中导入了一个数据集,并创建了计算列,以使我最终到达那里。@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()
)
上次购买日期=
貂皮(
滤器(
出售,
销售[销售年度]+1=更早(销售[销售年度])和销售[客户ID]=更早(销售[客户ID])
), 
马克斯(
滤器(
出售,
销售[销售年度]=早期(销售[销售年度])和销售[客户ID]=早期(销售[客户ID])
),
销售[销售日期]
)
)
一年日期=
貂皮(
滤器(
出售,
销售[销售年度]+1=更早(销售[销售年度])和销售[客户ID]=更早(销售[客户ID])
), 
马克斯(
滤器(
出售,
销售[销售年度]=早期(销售[销售年度])和销售[客户ID]=早期(销售[客户ID])
), 
EDATE(销售[销售日期],12)
)
)
ReturnCustomerID=
如果(
销售[销售日期]>销售[上次购买日期]&销售[销售日期]<销售[一年日期],销售[客户ID],空白()
)

我最终从多维数据集中导入了一个数据集,并创建了计算列,以便最终到达那里。@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()
)
上次购买日期=
貂皮(
滤器(
出售,
销售[销售年度]+1=EAR