Часто бывает ситуация, когда у вас есть база данных с подписчиками (вариант — регистрации на мероприятие), в которой содержится дата начала подписки и дата её окончания.
Если привязать к таблице-календарю дату начала подписки, то мы сможем посчитать количество подписавшихся в определённый день.
Если привязать к календарю дату отписки, то мы сможем посчитать количество отписавшихся на выбранную дату.
А как посчитать количество активных подписчиков на определенную дату или за выбранный период?
Исходя из вышеизложенных соображений, связь между исходной таблицей и таблицей-календарём не нужна.
Допустим, требуется посчитать количество активных подписчиков на 10 февраля 2020 года.
Алгоритм подсчёта может быть таким:
- считаем подписчиков с пустой датой отписки — то есть они активны до сих пор.
- считаем подписчиков, с датой отписки после 10 февраля 2020 года. То есть они не активны сейчас, но были подписчиками по состоянию на выбранную дату.
- считаем первые два пункта только для подписчиков, у кого дата подписки ранее 10 февраля 2020 года. То есть они подписались до выбранной даты.
Мера на DAX будет выглядеть так:
Active Subscribers =
var _currDate=SELECTEDVALUE('Date'[Date])
var _firstStartDate=MIN(Subscription[Start Date])
var _subscribers=
FILTER(
Subscription,
( ISBLANK(Subscription[End Date]) // всё ещё подписаны
|| Subscription[End Date]>=_currDate ) // были подписаны на выбранную дату, но сейчас нет
&& Subscription[Start Date]<=_currDate // подписались до выбранной даты
)
var _countRows=COUNTROWS(_subscribers)
return
if(
_currDate<=TODAY() && _currDate>=_firstStartDate,
if(ISBLANK(_countRows),0,_countRows)
)
Подробнее о вычислениях.
Сначала из таблицы-календаря мы получаем выбранную дату (напомню, что связей у нас между таблицами нет):
var _currDate=SELECTEDVALUE('Date'[Date])
Дале вычисляем дату первой подписки:
var _firstStartDate=MIN(Subscription[Start Date])
Создаем виртуальную таблицу, удовлетворяющую нашим условиям:
var _subscribers=
FILTER(
Subscription,
( ISBLANK(Subscription[End Date]) // всё ещё подписан
|| Subscription[End Date]>=_currDate ) // был подписан, но сейчас отписался
&& Subscription[Start Date]<=_currDate // дата подписки раньше выбранной
)
Подсчитываем количество строк в виртуальной таблице:
var _countRows=COUNTROWS(_subscribers)
Так как расчёт должен выполняться до текущей даты, делаем проверку:
return
if(
_currDate<=TODAY() && _currDate>=_firstStartDate,
if(ISBLANK(_countRows),0,_countRows)
)
Если в вашей модели данных связи между таблицами установлены, то меру нужно немного изменить:
Active Subscribers =
var _currDate=SELECTEDVALUE('Date'[Date])
var _firstStartDate=MIN(Subscription[Start Date])
var _subscribers=
FILTER(
ALL(Subscription),
( ISBLANK(Subscription[End Date]) // всё ещё подписаны
|| Subscription[End Date]>=_currDate ) // были подписаны, но отписались
&& Subscription[Start Date]<=_currDate) // подписался до выбранной даты
var _countRows=COUNTROWS(_subscribers)
return
if( _currDate<=TODAY() && _currDate>=_firstStartDate,
if(ISBLANK(_countRows),0,_countRows)
)
Статья подготовлена по материалам блога RADACAD.