DAX
October 6, 2021

Сравнение недели текущего и прошлого года

В аналитике мы часто сравниваем значения интересующего нас периода со значениями периода предыдущего. Для этого в #PowerBI есть множество функций категории Time intelligence, которые могут сдвигать даты на нужный период. Но действия этих функций ограничены стандартными периодами: день, месяц, квартал и год.

Если вы не отключили в параметрах PowerBI Desktop или в параметрах файла "Автоматические дата и время", то вы можете увидеть, что для столбцов с типом "Дата" или "Дата и время" создается автоиерархия, которая как раз состоит из этих же измерений: день, месяц, квартал и год. Но я рекомендую отключать этот параметр и создавать справочник календарь самостоятельно по двум причинам: 1. Автоиерархия дат не работает при использовании функции "Анализ в Excel" и 2. Автоиерархия не позволяет выполнять анализ по нестандартным периодам.

Рассмотрим пример из заголовка статьи и сформулируем задачу:

Пользователь должен иметь возможность выбрать год и неделю и сравнить полученное значение с аналогичной неделей прошлого года. Например: 40я неделя 2021 года - это даты с 27 сентября по 03 октября, а в 2020 году 40я неделя - это даты с 28 сентября по 04 октября.
Начальная и конечная даты недели годы

Если мы будем использовать встроенные функции работы с датами, например: DATEADD или SAMEPERIODLASTYEAR, то мы получим те же даты, просто сдвинутые на год назад, соответственно неделя будет "начинаться" с воскресенья, а не понедельника.

Сдвиг дат с использованием встроенных функций

Поэтому, чтобы сравнивать неделю с неделей и понедельник с понедельником - мы напишем собственную функцию.

Для того чтобы упростить решение задачи, перед написанием функции добавим в календарь столбец Year-Week, который будет содержать информацию о годе и неделе, но при этом будет являться целым числом, что позволит нам использовать в пользовательской функции простую математику.

Создание столбца Year-Week в справочнике Календарь

Теперь, чтобы получить ту же самую неделю предыдущего года, нам достаточно получить значение из столбца Year-Week и вычесть 100

Пользовательская функция
Так как мы создаём пользовательскую функцию - необходимо при изменении контекста принудительно сбросить фильтры с таблицы Calendar с помощью функции ALL, тогда как при использовании стандартных функций это происходит автоматически.
Результат пользовательской функции
Кстати, о том, как задать пользовательский формат для столбцов и мер можно прочитать в статье "Пользовательский формат данных".

В статье я не разбираю как правильно нумеровать недели внутри года: считать только полные недели или по стандарту ISO, или с 1го января, или возможно у вас свои пользовательские недели могут быть, но суть решения от этого не изменится - логика будет абсолютно та же.

Как обычно можно посмотреть и пощелкать отчёт, чтобы проверить результаты вычислений. Бонусом на второй странице сравнение декад.

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