Считаем подписчиков.

Часто бывает ситуация, когда у вас есть база данных с подписчиками (вариант — регистрации на мероприятие), в которой содержится дата начала подписки и дата её окончания.

Если привязать к таблице-календарю дату начала подписки, то мы сможем посчитать количество подписавшихся в определённый день.

Если привязать к календарю дату отписки, то мы сможем посчитать количество отписавшихся на выбранную дату.

А как посчитать количество активных подписчиков на определенную дату или за выбранный период?

Исходя из вышеизложенных соображений, связь между исходной таблицей и таблицей-календарём не нужна.

Допустим, требуется посчитать количество активных подписчиков на 10 февраля 2020 года.

Алгоритм подсчёта может быть таким:

  1. считаем подписчиков с пустой датой отписки — то есть они активны до сих пор.
  2. считаем подписчиков, с датой отписки после 10 февраля 2020 года. То есть они не активны сейчас, но были подписчиками по состоянию на выбранную дату.
  3. считаем первые два пункта только для подписчиков, у кого дата подписки ранее 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *