Ниже приведена упрощенная версия данных. Ежедневный список транзакций для идентификатора клиента
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 }
}
)
Цель: вычислить число повторно активированных и отработанных клиентов в течение текущего периода , который в приведенном ниже примере равен 1-7 апреля 2019 .
Сбитый = Неактивный в течение 90 дней и более.
Реактивировано = Неактивно в течение 90 дней или более до совершения последней покупки.
В матрице - как показано ниже - следующие показатели работают, как и ожидалось, для реактивированных и отточенных в текущем периоде, с 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.
Большое спасибо за помощь.