Записки охотника

Разметка периодов

Мелкие радости
Рвав-рвав, сегодня я – собака-задремака!

Перед вами 8-я заметка из нашего цикла "Мелкие радости", и сегодня мы рассмотрим такую проблему, как ручная разметка периодов, дабы "по нажатию одной кнопки" получать необходимый результат.
Ну и, буду честен, постоянно отвечать на вопрос: "А как получить текущий месяц?" и тому подобное, порядком поднадоело.
Вообще, в Power BI все это решается при помощи элемента визуализации "Срез", работающего в относительном режиме, но вот, например, на промежутке "неделя" он работает не совсем корректно. К тому же, подобные вещи часто используются в расчетах.
В общем, собравшись с силами, собака Смайл решил написать маленькую заметку, чтобы потом кидаться ссылками.

Пример:

Имеется таблица, содержащая один столбец, в котором находится случайный список дат:

Таблица
События

Задача:

Получить при помощи группы расчетных столбцов диапазон дат, размеченный определенным образом.

Решение:

  • Формула столбца "Метка года" может выглядеть следующим образом:

Метка года =
VAR _StartingPoint =
    TODAY ()
VAR _CurrentYear =
    YEAR ( 'Список дат'[Дата] ) = YEAR ( _StartingPoint )
VAR _LastYear =
    YEAR ( 'Список дат'[Дата] )
        = YEAR ( _StartingPoint ) - 1
VAR _FutureYear =
    YEAR ( 'Список дат'[Дата] )
        = YEAR _StartingPoint ) + 1
RETURN
    SWITCH (
        TRUE (),
        _CurrentYear"Текущий год",
        _LastYear"Прошлый год",
        _FutureYear"Следующий год",
        "Прочее"
    )

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

  • Формула столбца "Метка квартала" может выглядеть следующим образом:

Метка квартала =
VAR _StartingPoint =
    TODAY ()
VAR _CurrentYear =
    YEAR ( 'Список дат'[Дата] ) = YEAR _StartingPoint )
VAR _CurrentQuarter =
    QUARTER ( 'Список дат'[Дата] ) = QUARTER _StartingPoint )
        && _CurrentYear = TRUE ()
VAR _LastQuarter =
    QUARTER ( 'Список дат'[Дата] )
        = QUARTER _StartingPoint ) - 1
        && _CurrentYear = TRUE ()
VAR _FutureQuarter =
    QUARTER ( 'Список дат'[Дата] )
        = QUARTER _StartingPoint ) + 1
        && _CurrentYear = TRUE ()
RETURN
    SWITCH (
        TRUE (),
        _CurrentQuarter"Текущий квартал",
        _LastQuarter"Прошлый квартал",
        _FutureQuarter"Следующий квартал",
        "Прочее"
    )

  • Формула столбца “Метка месяца” может выглядеть следующим образом:

Метка месяца =
VAR _StartingPoint =
    TODAY ()
VAR _Today = 'Список дат'[Дата] = _StartingPoint
VAR _CurrentYear =
    YEAR ( 'Список дат'[Дата] ) = YEAR ( _StartingPoint )
VAR _CurrentMonth =
    MONTH ( 'Список дат'[Дата] ) = MONTH ( _StartingPoint )
        && _CurrentYear = TRUE ()
VAR _LastMonth =
    MONTH ( 'Список дат'[Дата] )
        = MONTH _StartingPoint ) - 1
        && _CurrentYear = TRUE ()
VAR _FutureMonth =
    MONTH ( 'Список дат'[Дата] )
        = MONTH _StartingPoint ) + 1
        && _CurrentYear = TRUE ()
RETURN
    SWITCH (
        TRUE (),
        _CurrentMonth"Текущий месяц",
        _LastMonth"Прошлый месяц",
        _FutureMonth"Следующий месяц",
        "Прочее"
    )

  • Формула столбца "Метка недели" может выглядеть следующим образом:

Метка недели =
VAR _StartingPoint =
    TODAY ()
VAR _CurrentYear =
    YEAR ( 'Список дат'[Дата] ) = YEAR _StartingPoint )
VAR _CurrentWeek =
    WEEKNUM ( 'Список дат'[Дата], 2 ) = WEEKNUM _StartingPoint2 )
        && _CurrentYear = TRUE ()
VAR _LastWeek =
    WEEKNUM ( 'Список дат'[Дата], 2 )
        = WEEKNUM _StartingPoint2 ) - 1
        && _CurrentYear = TRUE ()
VAR _FutureWeek =
    WEEKNUM ( 'Список дат'[Дата], 2 )
        = WEEKNUM _StartingPoint2 ) + 1
        && _CurrentYear = TRUE ()
RETURN
    SWITCH (
        TRUE (),
        _CurrentWeek"Текущая неделя",
        _LastWeek"Прошлая неделя",
        _FutureWeek"Следующая неделя",
        "Прочее"
    )

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

  • Формула столбца “Метка дня” может выглядеть следующим образом:

Метка дня =
VAR _StartingPoint =
    TODAY ()
RETURN
    SWITCH (
        'Список дат'[Дата] - _StartingPoint,
        0"Текущий день",
        -1"Прошлый день",
        1"Следующий день",
        "Прочее"
    )

Рвав-рвав, как вы, возможно, заметили, формулы, приведенные ранее, были построены по одному шаблону, но решений может быть несколько, поэтому выше была продемонстрирована конструкция SWITCH, а не SWITCH ( TRUE ()…).

  • В результате создания описанных расчетных столбцов будет сформирована таблица следующего вида:

Таблица
Расстановка меток

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

Всем веселья и добра!
Ваш Смайл