下面是数据的简化版本。客户ID的每日交易列表
SalesData =
DATATABLE (
"Customer ID", INTEGER,
"Date", DATETIME,
"Amount", INTEGER,
{
{ 101245, "2019/04/07", 500 },
{ 101245, "2018/08/05", 400 },
{ 100365, "2018/07/30", 900 },
{ 100365, "2018/02/22", 700 },
{ 104300, "2019/04/05", 300 },
{ 104300, "2019/04/03", 350 },
{ 104300, "2019/04/01", 310 },
{ 107804, "2018/11/08", 650 },
{ 107804, "2018/11/19", 640 },
{ 108040, "2019/01/02", 730 }
}
)
目标:计算当前期间中的重新激活和搅动的客户,在下面的示例中为 2019年4月1日至7日。
搅动= 90天或更长时间不活跃。
已重新激活=在进行最新购买之前,已激活90天或更长时间。
在一个矩阵(如下图所示)中,以下措施按预期的方式工作,即在4月1日至7日的当前期间重新激活并进行。
churnedInCurrentPeriod =
VAR dayspassed =
DATEDIFF(
MAX(SalesData[Date]),
CALCULATE(
MAX(SalesData[Date]),
ALLEXCEPT(SalesData,SalesData[Date])),
DAY)
Return
IF(dayspassed >= 90 && dayspassed <= 97,1,0)
请注意,在这种情况下,“当前期间”需要动态显示日期,这就是为什么日期切片器在那里,我在日期列上使用allexpect使其起作用。在if语句中,该时间为90 + 7天,这也应该保持动态。
ReactivatedInCurrentPeriod =
VAR differenceDays =
DATEDIFF(
CALCULATE(
MAX(SalesData[Date]),
FILTER(SalesData,SalesData[Date] <> MAX(SalesData[Date])
)
),
MAX(SalesData[Date]),
DAY
)
RETURN
IF(AND(differenceDays >= 90,MAX(SalesData[Date]) >= DATE(2019,4,1)),1,0)
如屏幕截图所示,矩阵按预期工作。不是总数。我尝试使用带有“不重复计数”的计算来对客户进行相应计数而没有成功。目前,我通过导出excel(!)中的矩阵和总和来解决此问题。
它是使用DAX进行这项工作的更好方法。
非常感谢您的帮助。
答案 0 :(得分:2)
首先,您需要一个Dates
表,该表与您的SalesData
表没有任何关系,以用作切片器。以下内容足以满足此处的目的:
Dates = CALENDAR( DATE( 2018, 1, 1 ), DATE( 2019, 12, 31 ) )
将其用作切片器时,您可以读取最大日期和最小日期,以获得如下所示的动态周期:
ChurnedInPeriod =
VAR MaxDate = MAX ( Dates[Date] )
VAR MinDate = MIN ( Dates[Date] )
VAR CustomerLastDate = CALCULATE ( MAX ( SalesData[Date] ), SalesData[Date] <= MaxDate )
VAR DaysPassed = MaxDate - CustomerLastDate
VAR PeriodLength = MaxDate - MinDate
RETURN
IF ( DaysPassed >= 90 && DaysPassed <= 90 + PeriodLength, 1, 0 )
这不能解决小计问题,但是您现在可以编写一个新的度量,该度量使用上面的方法:
ChurnedCount = SUMX ( VALUES ( SalesData[Customer ID] ), [ChurnedInPeriod] )
重新激活帐户的方法应该相似。
此处的关键是您需要分别评估每个客户的ChurnedInPeriod
,而这正是ChurnedCount
所做的。对于每个单独的客户,它将为该客户评估ChurnedInPeriod
,然后将它们全部加在一起。这种SUMX ( VALUES( ... ), ... )
模式通常适用于需要从较低粒度计算中汇总的小计。