powerbi - Power BI - DAX Measure 计算当前期间流失和重新激活的客户。总数不正确

标签 powerbi dax datediff measure

以下是数据的简化版本。客户ID每日交易 list

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)

enter image description here

如屏幕截图所示,矩阵按预期工作。不是总数。我尝试使用带有 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( ... ), ... )模式对于需要从较低粒度计算汇总的小计很常见。

这里是 another question讨论 SUMX ( VALUES ( ... ), ... )并包含更多链接。

关于powerbi - Power BI - DAX Measure 计算当前期间流失和重新激活的客户。总数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55615736/

相关文章:

powerbi - Power BI - 在计算函数中使用过滤器

powerpivot - 使用 DAX 检索表格数据的前 100 行

没有结束日期的 SQL DateDiff

mysql - 从 sql 表中获取缺失的日期

Power BI 中的 Python 控制台

python-3.x - 带有 Power BI 的 Windows 中的 Anaconda

powerbi - 具有两个条件的 Power BI/DAX Countax

sql-server - 日期差异表现

azure - 我可以在 Power BI 中使用 Azure 认知搜索吗?

powerbi - 使前几行对切片器 Power BI 无响应