powerbi - Power BI - DAX Measure 计算当前期间流失和重新激活的客户。总数不正确
问题描述
以下是数据的简化版本。客户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)
如屏幕截图所示,矩阵按预期工作。不是总数。我尝试使用带有 distinctcount 的计算来相应地计算客户,但没有成功。目前我通过在excel(!)中导出矩阵和求和来在我的真实数据集中解决这个问题。
必须是一种更好的方法来使用 DAX 进行这项工作。
非常感谢您的帮助。
解决方案
首先,您需要一个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( ... ), ... )
对于需要从较低粒度计算汇总的小计,这种模式很常见。
这是另一个讨论SUMX ( VALUES ( ... ), ... )
并包含更多链接的问题。
推荐阅读
- angular - 在 firebase.json 中未检测到托管站点或目标
- javascript - 没有从firebase数据库内的返回中获取数据
- python-3.x - 在 Mac 上运行 python3 和 selenium 的问题
- verilog - 在 Verilog / SystemVerilog 中实例化处理元素网格的最佳方法?
- java - 如何过滤页面流
通过 Spring Boot 应用程序中的流 Java 11 API - python - rpy2 2.9.4版安装错误使用conda
- c - 在 C 中用 memcpy 替换 for 循环不起作用
- swiftui - macCatalyst 应用程序构建但不会在 Mac 上启动
- reactjs - Apex 图表不会立即显示
- python - 尝试使用附加,当我尝试打印附加创建的列表时,它显示“无”