Поделиться через


Реализация вычислений на основе времени в Power BI

Power BI предлагает несколько средств для выполнения вычислений на основе времени, которые используют автоматические таблицы дат или таблицы дат, которые вы добавляете.

Мы рекомендуем использовать аналитику времени на основе календаря (предварительная версия), так как она обеспечивает лучшую производительность и самый высокий диапазон гибкости для удовлетворения любого календаря.

В этой таблице сравниваются три средства:

Tool Необходимые усилия по настройке Простота управления Гибкость Примечания.
Автоматическая дата и время практически ноль жесткий низкий Увеличивает размер модели из-за нескольких скрытых таблиц дат, созданных
Классическая аналитика времени medium простой низкий Требуется создание таблицы дат, которая предполагает использование григорианского или смещенного григорианского календаря, и испытывает проблемы с производительностью в некоторых специфических сценариях.
Аналитика времени на основе календаря высокий medium высокий Рекомендуется создать таблицу дат, высокую гибкость, лучшую производительность, но увеличить затраты на настройку

Замечание

Мы советуем избегать использования альтернативных методов темпорального анализа, в частности тех, которые включают добавление дополнительных столбцов в таблицы дат для расчета смещений, за исключением конкретных случаев. Хотя эти подходы могут обратиться к новичкам из-за их простых формул DAX, они, как правило, раздувают семантические модели без необходимости. Это увеличение размера может привести к замедлению обновления данных и снижению производительности отчета по мере роста наборов данных.

Автоматическая дата и время

Функция автоматической даты и времени автоматически создает скрытые таблицы дат для каждого поля даты в модели данных. Дополнительные сведения об этом автоматическом поведении см. в разделе "Применить автоматическую дату и время" в Power BI Desktop.

Замечание

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

Добавление таблицы дат

Для большинства моделей рекомендуется добавить таблицу дат (или более в некоторых сценариях). Многие аналитики данных предпочитают создавать собственные таблицы дат, что хорошо.

Существует несколько способов создания такой таблицы, в том числе:

Какой вариант лучше всего подходит для вас, зависит от различных факторов и выходит за рамки этого руководства.

Работа с временными вычислениями

Если вы не используете автоматическую дату и время, в Power BI можно использовать два альтернативных способа работы с функциями аналитики времени в Power BI для выполнения вычислений на основе времени:

  • Классический интеллект времени. Самый простой вариант и отлично подходит для григорианских или перемещенных григорианских календарей, но имеет ограниченную гибкость для календарей, структурированных по-разному или для еженедельных вычислений.
  • Аналитика времени на основе календаря (предварительная версия) Более новый вариант, но требует немного больше работы для настройки. Однако она также обеспечивает более высокую производительность, большую гибкость для работы с негрегорскими календарями и способностью выполнять еженедельные вычисления.

Замечание

Для определенных сценариев необходимо назначить таблицу в качестве таблицы дат.

Классическая аналитика времени

Для этого параметра требуется, чтобы в модели была таблица дат и она была настроена соответствующим образом. После этого вы можете использовать функции аналитики времени и ссылаться на таблицу дат. Например, если у вас есть таблица дат с именем Date в модели, заданной в качестве таблицы дат, которая содержит столбец даты, можно использовать:

SAMEPERIODLASTYEAR ( 'Date'[Date] )

Хотя это быстрый и простой подход, существует много недостатков по сравнению с подходом на основе календаря:

  • для него требуется задать таблицу дат
  • он работает только с моделями, имеющими по крайней мере одну выделенную таблицу дат
  • Используемые столбцы дат не должны содержать отсутствующие даты между первыми и последними датами. Если отсутствуют даты между первой и последней датами, выдаётся сообщение об ошибке.
  • он менее гибкий, так как он оптимизирован для григорианских или смещенных григорианских календарей, таких как финансовые годы, которые начинаются 1 июля, но по-прежнему следуют григорианскому календарю
  • Он не предоставляет еженедельные вычисления
  • В определенных сценариях вычисления на основе времени не работают эффективно.

Замечание

Мы рекомендуем использовать расширенный подход на основе календаря .

Аналитика времени на основе календаря (предварительная версия)

Календари — это определения метаданных, добавленные в таблицу, чтобы указать, какие столбцы из этой таблицы представляют атрибуты времени. Вы можете определить один или несколько календарей в любой таблице в модели. Определив календарь в модели, вы можете ссылаться на него в функциях аналитики времени. Например, вот как вычислить общий год к дате продаж с помощью определенного финансового календаря:

TOTALYTD ( [Sales], 'Fiscal Calendar' )

Преимущества аналитики времени на основе календаря

Основными преимуществами аналитики времени на основе календаря являются:

Работает с любым календарем

Календари дают вам полную гибкость, чтобы решить, как разделить время в годах, кварталах, месяцах и неделях. Например, можно определить календари, которые следуют этим шаблонам:

  • Gregorian
  • Сдвинутое грегорианское календарное исчисление
  • Розничная торговля (445, 454, 544 паттернов)
  • 13-месячный
  • Лунный

Возможности бесконечны, так как встроенные предположения из Power BI о структуре календаря отсутствуют. Аналитика времени на основе календаря не предполагает базовых дат. Все вычисления используют базовые данные точно в исходном виде.

Разреженные даты

Классические функции временной аналитики требуют, чтобы предоставленный столбец даты был полным. Если между первой и последней датами отсутствуют какие-либо даты, возникает ошибка. Функции аналитики времени на основе календаря не имеют такого требования. Вместо этого они работают с датами в неизменном виде. Хотя мы по-прежнему рекомендуем иметь полную и выделенную таблицу календаря, вам больше не нужно иметь это. Например, если все ваши розничные магазины закрыты на выходные, вы можете пропустить эти дни, так как у них нет продаж. Предполагая, что ваши выходные дни - это суббота и воскресенье, вы можете использовать PREVIOUSDAY с календарем на основе таблицы, которая не имеет записей для выходных, чтобы перейти с понедельника сразу на пятницу.

Еженедельные вычисления

Аналитика календарного времени напрямую предоставляет функции DAX, которые работают на уровне недель. Например, суммарные итоги по неделям можно вычислить напрямую с помощью TOTALWTD:

TOTALWTD ( Expr, CalendarName )

Улучшения производительности

Некоторые сценарии могут повысить производительность при сравнении функции аналитики времени на основе календаря с его классическим аналогом. Например, визуальный элемент, сгруппированный по неделе и выполняющий годовой расчет с помощью TOTALYTD ( ..., CalendarName ), обычно должен выполняться быстрее, чем при использовании его классического аналога TOTALYTD ( ..., TableName[DateColumnName] ). Сведения о том, почему это может произойти, см. в разделе "Очистка контекста ".

Включение расширенной предварительной версии аналитики времени DAX

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

  1. В Power BI Desktop перейдите в раздел "Параметры файла > " и "Параметры >> предварительной версии".
  2. Выберите предварительную версию расширенной аналитики времени DAX .
  3. Нажмите кнопку "ОК"
  4. Перезапуск Power BI Desktop

Управление календарями

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

Снимок экрана: точки входа для открытия параметров календаря в таблице.

В качестве альтернативы можно использовать сторонние инструменты или представление TMDL для определения календаря. Дополнительные сведения см. в скрипте TMDL.

Календари также отображаются в обозревателе моделей в таблице, в которой они определены:

Снимок экрана: обозреватель моделей для семантической модели. Узел таблицы даты развернут и выделены календари.

Экран параметров календаря

На экране параметров календаря отображаются календари, определенные в выбранной таблице. Здесь можно:

  • Создайте новый календарь, выбрав "Создать календарь"
  • измените существующий календарь, нажав кнопку "Изменить"
  • Удаление существующего календаря путем нажатия кнопки "Удалить"
  • Задайте таблицу в качестве таблицы дат, выбрав "Пометить как таблицу дат"

Снимок экрана: параметры календаря в таблице.

Назначение категорий столбцов

Определение календаря включает указание имени и назначение столбцов категориям. Каждая категория представляет собой единицу времени и доступны определенные категории столбцов . Для того чтобы сохранить календарь, необходимо назначить по крайней мере один первичный столбец в категорию. Каждая категория должна иметь основной столбец и может иметь ноль или более связанных столбцов. Всякий раз, когда столбцы, связанные с какой-либо категорией, находятся в контексте, Power BI знает, какой единицей времени они представлены. Кроме того, для некоторых функций, таких как TOTALMTD Power BI, использует основной столбец, сопоставленный с соответствующей категорией в календаре, на который ссылается ссылка, для выполнения запрошенного вычисления. Чтобы назначить столбец категории, выберите категорию в меню "Добавить категорию", а затем выберите основные и необязательные связанные столбцы.

Снимок экрана: экран создания и редактирования календаря.

Доступные категории столбцов

В следующей таблице показаны доступные категории. В таблице также приведены примеры значений и кратностей для григорианских календарей.

Категории делятся на две группы:

  • Завершено. Данные в столбцах, относящихся к категориям "Complete", достаточно для однозначного определения периода времени.
  • Частичный. Данные в столбцах, назначенных частичным категориям, недостаточно для уникальной идентификации периода времени.
Категория Description Тип Пример кратности в григорианском календаре Пример значений столбцов в григорианском календаре
Год Год Завершено Y = количество лет 2024, 2025
Квартал Квартал, включая год Завершено 4*Y 1 квартал 2024, 2 квартал 2025
Четверть года Четверть года Частично 4 Год Квартал 1, YQ1, Q1, Квартал 2
Месяц Месяц, включая год Завершено 12*Y ≤ value ≤ 13*Y Январь 2023 г., февраль 2024 г.
Месяц года Месяц года Частично 12 Январь, Год Месяц 11, YM11, M11, 11
Месяц квартала Месяц квартала Частично 3 1, QM2
Неделя Неделя, включая год Завершено 52 ≤ value ≤ 53 Неделя 50 2023, W50-2023, 2023-W50
Неделя года Неделя года Частично 52 Неделя 50, W50, 50
Неделя квартала Неделя квартала Частично 13 Четверть недели 10, QW10, 10
Неделя месяца Неделя месяца Частично 5 Неделя месяца 2, МВТ2, 2
Date Дата Завершено 365*Y ≤ value ≤ 366*Y 12/31/2025
День года День года Частично 365 ≤ value ≤366 365, D1
День квартала День квартала Частично 92 Квартальный день 10, QD2, 50
День месяца День месяца Частично 31 День месяца 30, MD10, 30
День недели День недели Частично 7 День недели 5, Рабочий день 5, 5

Помимо этих категорий, можно связать любое количество столбцов в таблице с категорией , связанной с временем . В настоящее время это не возможно в параметрах календаря, но вместо этого можно сделать только с помощью внешних средств или TMDL.

Замечание

Контекст для всех столбцов, назначенных категории , связанной с временем , удаляется при выполнении вычислений во всех функциях, кроме DATEADD и SAMEPERIODLASTYEAR. Любой контекст столбцов, которые входят в таблицу, в которой определен календарь, но не помечены в этом календаре, сохраняется.

Замечание

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

Первичные и связанные столбцы

Для каждой категории требуется основной столбец. Всякий раз, когда этот столбец или любые связанные столбцы, назначенные той же категории в указанном календаре, находятся в контексте, или если для выполнения вычисления требуется категория, Power BI использует основной столбец. Кроме того, для сортировки используются основные столбцы. Если значения в основном столбце не позволяют сортировать его, как ожидалось, можно настроить основной столбец для сортировки по другому столбцу или использовать другой столбец и сделать исходный столбец связанным столбцом. Например, столбец с текстовыми данными, содержащими номер месяца и год в формате mm-yyyy (то есть 01-2024, 02-2024 и так далее), не будет правильно сортироваться через несколько лет, но столбец, использующий формат yyyy-mm, будет:

Снимок экрана: две таблицы. Каждая таблица имеет один столбец. Первая таблица содержит столбец с текстовым номером месяца и годом в формате мм-гггг, а второй содержит те же данные в формате гггг-мм. Столбец, содержащий данные формата мм гггг, не отсортированы правильно.

Для категории можно назначить нулю или больше связанных столбцов.

Validation

Важно проверить и протестировать календарь, чтобы удостовериться, что он соответствует вашим потребностям. Проверки, предлагаемые в Power BI, включают как проверки в режиме реального времени , так и автономные проверки.

Замечание

Вы можете сохранить календарь, несмотря на ошибки автономной проверки, но сначала рекомендуется устранить их. Для сохранения необходимо исправить сбои проверки в режиме реального времени.

Проверки в режиме реального времени

В календарях выполняются проверки в режиме реального времени:

  • Уникальное имя календаря. Каждый календарь должен иметь уникальное имя в семантической модели.
  • Одна ассоциация на календарь. Столбец не может принадлежать нескольким категориям в одном календаре.
  • Уникальность периода. Назначенные категории должны однозначно определить период.
  • Согласованность классификации. Это гарантирует, что столбцы связаны с одной и той же категорией в календарях.

Уникальность периодов

Всегда должен быть путь для уникальной идентификации периода для назначенных категорий.

При добавлении частичной категории Power BI проверяет, что сочетание полных или частичных категорий также помечено в одном календаре. Если это не так, отображается предупреждение.

Снимок экрана: экран создания и редактирования календаря с ошибкой проверки в режиме реального времени.

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

  • Неделя
  • Неделя в году, год
  • Неделя квартала, квартал
  • Неделя квартала, квартал года, год
  • Неделя месяца, месяц
  • Неделя месяца, месяц года, год
  • Неделя месяца, Месяц квартала, Квартал
  • Неделя месяца, месяц квартала, квартал года, год

Согласованность классификации

Столбцы должны иметь согласованную категорию в календарях. Вы не можете назначить один и тот же столбец разным категориям, таким как Year, Квартал года или связанные со временем в разных календарях.

Автономные проверки

Автономные проверки могут занять много времени, так как они обращаются к табличным данным. Поэтому они не выполняются автоматически в отличие от проверок в режиме реального времени. Чтобы выполнить проверки, выберите "Проверить данные":

Снимок экрана: экран создания и редактирования календаря. Выделена кнопка

Офлайн валидации проверяют следующие правила и возвращают предупреждение, если какие-либо правила недействительны в вашем календаре:

  • Столбец, связанный с категорией, не имеет пустых значений.
  • Категории более высокого уровня и более низкого уровня имеют кардинальное соотношение "один ко многим". Например, столбцы, связанные с категорией "Год", должны иметь отношение "один ко многим" со столбцами, связанными с категорией "Месяц".
  • Столбцы, связанные с категориями на одном уровне, имеют отношение кратности "один к одному". Например, столбцы, связанные с категорией "Месяц", должны иметь кардинальность "один к одному" с сочетаниями столбцов, связанных с категориями "Месяц года" и "Год".
  • первичные и связанные столбцы, назначенные той же категории, имеют кардинальное отношение "один к одному". Например, при назначении категории "Месяц" основной столбец "Месяц" и связанный столбец EnglishMonthName должны иметь кардинальность "один к одному".

Работа с календарями

После определения календаря вы можете ссылаться на него в функциях аналитики времени. Например, следующая мера вычисляет значение общего количества на текущий месяц для календаря ISO-454.

Total Quantity MTD ISO-454 = TOTALMTD ( [Total Quantity], 'ISO-454' )

Если календарь не определен и возвращается ошибка:

Снимок экрана, показывающий измерение с использованием функции TOTALMTD с календарным параметром, к несуществующему календарю.

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

Снимок экрана, показывающий измерение с использованием функции TOTALWTD и допустимой ссылкой на календарь, которая не определяет необходимые категории.

Функции аналитики времени и обязательные категории

Для многих функций аналитики времени требуется достаточное количество категорий, которые должны быть включены в календарь, на который ссылается вызов функции, чтобы Power BI идентифицировать уникальную единицу времени. Иными словами, Power BI должен иметь возможность подниматься от уровня, на котором выполняются вычисления, до отдельного года. Например, при выполнении вычисления по кварталам, либо назначьте категорию TOTALQTD, либо назначьте обе категории: "Квартал года" и "Год" в календаре в соответствии с проверкой уникальности периода.

Замечание

Для некоторых функций их имя свидетельствует о том, какой уровень вычислений работает (например, TOTALYTD), а для других он зависит от параметров и контекста (например, DATEADD).

Очистка контекста

Функции аналитики времени работают, начиная с точки во времени, а затем выполняют некоторые операции на нем, чтобы получить другую точку во времени. Естественно, начальный момент во времени может конфликтовать с этим результатом, что приводит к пересечению контекста фильтра, которое по умолчанию дает частичные или пустые результаты. Например, рассмотрим следующий сценарий.

Определение календаря

У нас есть простой григорианский календарь, который отмечает три категории, определяемые как:

Категория Основной столбец
Год Год
Месяц года MonthOfYear
Квартал Квартал

Определения мер

Определены два основных показателя: один для вычисления общего объема продаж, а другой — для вычисления общего объема продаж за предыдущий квартал:

[TotalSales] = CALCULATE ( SUM( FactInternetSales[SalesAmount] ) )
[LastQuarterSales] = CALCULATE ( [TotalSales], DATEADD( GregorianCalendar, -1, QUARTER ) )

Пример. Как работает очистка контекста

Наш визуальный элемент таблицы просматривает детализацию месяца с помощью столбцов Year и MonthOfYear :

Год MonthOfYear Общие продажи ПродажиЗаПоследнийКвартал
2011 1 10
2011 2 20
2011 3 30
2011 4 40 10
2011 5 50 20

В этой таблице полужирная строка обозначает просмотр на уровне месяца за апрель 2011 года. Таким образом, все меры в этой строке будут оцениваться в контексте фильтра [Year] == 2011 и [MonthOfYear] == 4.
Как ожидается, TotalSales здесь вычисляется как общий объем продаж за апрель 2011 года.

LastQuarterSales аналогично вычисляет TotalSales, но при условии дополнительного фильтра, предоставленного DATEADD функцией на основе календаря. Для этой строки DATEADD будет иметь начальную точку во времени — апрель 2011 года, и даст момент времени, который составляет ровно один квартал назад: январь 2011 года. В результате можно ожидать, что этот totalSales будет вычисляться в следующих двух контекстах фильтра:

  • Предоставляется просмотром столбцов текущей строки: { [Year] == 2011, [MonthOfYear] == 4 } (эквивалентно апрель 2011 г.)
  • Предоставлен фильтром DATEADD : { [Year] == 2011, [MonthOfYear] == 1 } (эквивалентно, январь 2011 г.)

Очевидно, что эти два контекста фильтра будут конфликтовать - мы не можем оценить общий объем продаж, учитывая текущий месяц как январь 2011 , так и апрель 2011 года. Такое пересечение не даст никаких результатов. Однако это не то, что происходит. Вместо этого на основе определения календаря функции аналитики времени на основе календаря определяют, какие столбцы категорий могут привести к конфликтам после операции времени, выполняемой функцией. В этом случае DATEADD выполняет сдвиг на уровне квартала . Функция определяет, что категории "Год " и " Месяц года " могут изменяться в результате изменения столбцов категории квартала . Таким образом, функция очищает контекст фильтра для всех (как первичных, так и связанных) столбцов, помеченных этими категориями.

Другими словами, можно сказать, что категории "Год и месяц года " являются зависимостями категории "Квартал ". И наоборот, можно сказать, что категория "Квартал" зависит от категорий "Год " и "Месяц года ".

Как работает очистка контекста

Диаграмма сетчатой структуры всех категорий календаря.

Эта схема предоставляется для лучшего визуализации зависимостей между различными категориями времени. Каждая категория в этой решетке представляет все столбцы (первичные и связанные) помеченные в эту категорию. Категории подключены к их зависимостям с помощью стрелок. Например, "Месяц" зависит от "Год", "Квартал года", "Месяц квартала", "Квартал" и "Месяц года".

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

  1. Все зависимости категории X. Это можно рассматривать как все категории, находящиеся выше X.
  2. Все категории зависят от X и его зависимостей (т. е. от 1. выше). Это можно считать всеми категориями ниже X и всеми категориями начиная с 1 и выше.

Замечание

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

Большинство функций аналитики времени, за исключением DATEADD и SAMEPERIODLASTYEAR, будут очищать контекст для всех столбцов, связанных с временем, и связанных столбцов сортировки.

Поведение между календарями

Если в одной таблице определено несколько календарей, эти процессы выполняются для каждого календаря, определенного в таблице. Это включает в себя замечание относительно очистки контекста столбцов, связанных с временем. Другими словами, предположим, что таблица определяет три календаря: Calendar1, Calendar2 и Calendar3. Если контекст фильтра задан для категории "X" в Calendar1, описанные выше процессы выполняются во всех трех календарях.

Пример: фильтрация по параметру "Квартал"

Если контекст фильтра был задан в категории "Квартал", процесс будет следующим образом.

  1. Сначала будут рассмотрены все зависимости категории "Квартал".

    Пример поведения очистки контекста фильтра начиная с категории Квартал: зависимости.

  2. Далее будут рассматриваться все зависимые компоненты "Квартала" и его зависимости.

    Пример поведения очистки контекста фильтра начиная с категории Квартал: Зависимые.

  3. Наконец, конечный результат будет следующим. Все категории, окрашенные в красный цвет, будут лишены предыдущего контекста фильтра, и новый контекст будет установлен на квартал.

    Пример поведения очистки контекста фильтра, начиная с категории

Скрипт TMDL для календарей

createOrReplace

	table Date
		lineageTag: xyz

		column Date
			dataType: dateTime
			formatString: Long Date
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Date

        column Year
			dataType: string
			lineageTag: abc
			summarizeBy: none
			sourceColumn: Year

			annotation SummarizationSetBy = Automatic
        
        column Month
			dataType: string
			lineageTag: def
			summarizeBy: none
			sourceColumn: Month

			annotation SummarizationSetBy = Automatic

        column MonthName
			dataType: string
			lineageTag: ghi
			summarizeBy: none
			sourceColumn: MonthName
			sortByColumn: SortByMonth

			changedProperty = SortByColumn

			annotation SummarizationSetBy = Automatic

        column DutchMonthName
			dataType: string
			lineageTag: jkl
			summarizeBy: none
			sourceColumn: DutchMonthName

			annotation SummarizationSetBy = Automatic

        column 'Holiday Name'
			dataType: string
			lineageTag: mno
			summarizeBy: none
			sourceColumn: Holiday Name

			annotation SummarizationSetBy = Automatic
        
        column IsWorkingDay
			dataType: string
			lineageTag: pqr
			summarizeBy: none
			sourceColumn: IsWorkingDay

			annotation SummarizationSetBy = Automatic
		...	
		
		calendar 'Demo Calendar'
			lineageTag: def

			calendarColumnGroup = year
				primaryColumn: Year

			calendarColumnGroup = month
				primaryColumn: Month
				associatedColumn: DutchMonthName
				associatedColumn: MonthName
			
			calendarColumnGroup
                column: 'Holiday Name'
                column: isWorkingDay

Замечание

Обратите внимание, что если в TMDL не указана какая-либо категория calendarColumnGroup , столбцы помечены как связанные с временем. В этом примере имя праздника и isWorkingDay — это столбцы, связанные с временем в демонстрационном календаре.

Объедините все вместе: примеры изменения времени

Некоторые функции временной аналитики сдвигают контекст только по горизонтали, учитывая все столбцы, в то время как другие выполняют иерархические сдвиги, сохраняя или очищая контекст в зависимости от того, помечены ли столбцы в календаре. Функции аналитики времени можно разделить на две группы на основе того, разрешают ли они иерархические сдвиги:

  • Исправлено. Функции в этой группе — DATEADD и SAMEPERIODLASTYEAR. Эти функции позволяют только сдвиги по времени и не возвращают значения с другого уровня детализации данных.
  • Гибкий. Эта группа содержит все другие функции аналитики времени. Эти функции допускают иерархические сдвиги времени и, в зависимости от настройки календаря, могут возвращать результаты с другого уровня детализации.

Чтобы показать это поведение, давайте рассмотрим пример с помощью простой модели данных, состоящей из двух таблиц, двух календарей и пяти мер.

Таблицы и связи

В этом примере у нас есть следующая простая модель данных:

Таблица Колонны
Date Год, ЯвляетсяРабочимДнем, Дата
Продажи КлючЗаказа, Количество, ДатаЗаказа

Ниже приведены некоторые примеры строк в таблице Date : снимок экрана: первые 14 строк примера таблицы Date. Таблица определяет Date, Year и IsWorkingDay. Столбец Date содержит дату, столбец

Ниже приведены некоторые примеры строк в таблице Sales : снимок экрана: первые девять строк примера таблицы Sales. Таблица определяет OrderKey, OrderDate и Количество заказов. Столбец OrderKey содержит уникальное число для каждого заказа на продажу, OrderDate — это дата, которая относится к дате продаж, а количество заказов — числовой столбец, представляющий количество продуктов для каждого заказа.

Таблицы Sales и Date связаны по полям OrderDate и Date.

Снимок экрана, показывающий представление примерной модели. В нем показаны таблицы

Calendars

В таблице date мы определили календари с этими сопоставлениями:

ИмяКалендаря Категория Основной столбец
Григорианский Год Год
Date Date
ГригорианWithWorkingDay Год Год
Date Date
Связанные с временем IsWorkingDay

Эквивалентным определением TMDL этих двух календарей является следующее:

ref table Date
    calendar 'Gregorian'
        lineageTag: xyz
    
        calendarColumnGroup = year
    	    primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    calendar 'GregorianWithWorkingDay'
    	lineageTag: dc4fc383-1661-4112-8afb-930d324fbb6e
    
    	calendarColumnGroup = year
    		primaryColumn: Year
    
    	calendarColumnGroup = date
    		primaryColumn: Date
    
    	calendarColumnGroup
    		column: IsWorkingDay   

Меры

В таблице Sales мы определим следующие меры:

Total Quantity = SUM ( 'Sales'[Order Quantity] )

OneYearAgoQuantity =
CALCULATE ( [Total Quantity], DATEADD ( 'Gregorian', -1, YEAR ) )

OneYearAgoQuantityTimeRelated =
CALCULATE ( [Total Quantity], DATEADD ( 'GregorianWithWorkingDay', -1, YEAR ) )

FullLastYearQuantity =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'Gregorian', -1, YEAR ) )

FullLastYearQuantityTimeRelated =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR )
)

Пример бокового смещения

Давайте создадим визуальный элемент, показывающий Year, MonthOfYear, IsWorkingDay, Total Quantity, OneYearAgoQuantity и OneYearAgoQuantityTimeRelated за 2024 и 2025 годы:

Снимок экрана: визуальный элемент таблицы, показывающий Year, IsWorkingDay, Total Quantity, OneYearAgoQuantity и OneYearAgoQuantityTimeRelated. Значения OneYearAgoQuantity и OneYearAgoQuantityTimeRelated за 2025 год соответствуют значениям 2024 для одних и того же значения IsWorkingDay.

Все значения для OneYearAgoQuantity и OneYearAgoQuantityTimeRelated за 2025 год соответствуют Total Quantity от точно одного года назад (2024) для того же значения IsWorkingDay.

В этом примере показано, что DATEADD сохраняет контекст для любого столбца в таблице Date, который содержит используемый календарь, независимо от того, помечен он как не связанный или связанный со временем в этом календаре. Так как в определениях мер мы поручили DATEADD вернуться к одному году, единственный столбец, контекст которого был смещен, был столбец, связанный с категорией Года. Независимо от того, был ли столбец IsWorkingDay в календаре помечен как связанный с временем или вообще не помечен, это не изменило результат. Единственная другая функция, которая демонстрирует это поведение, является SAMEPERIODLASTYEAR.

Пример иерархического смещения

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

Для этого мы создадим ту же визуализацию, что и в предыдущем примере, но на этот раз будем использовать меры FullLastYearQuantity и FullLastYearQuantityTimeRelated. Снимок экрана показывает визуализацию таблицы, включающую Год, IsWorkingDay, Общее количество, FullLastYearQuantity и FullLastYearQuantityTimeRelated. Значения FullLastYearQuantity для 2025 года соответствуют значениям 2024 года для тех же дней, когда IsWorkingDay, но значения для FullLastYearQuantityTimeRelated равны общему значению количества, независимо от значений IsWorkingDay.

Это показывает, что PARALLELPERIOD сохраняет контекст для столбцов, не помеченных в календаре, но очищает контекст для тех, которые помечены как связанные с временем. FullLastYearQuantity использовал григорианский календарь, где IsWorkingDay не был помечен в календаре, в то время как FullLastYearQuantityTimeRelated использовал календарь ГрегорианWithWorkingDay, где IsWorkingDay был помечен как связанный с временем. Все функции аналитики, за исключением DATEADD и SAMEPERIODLASTYEAR, ведут себя таким образом.

Бонус. Если вы действительно хотите принудительно применить эти функции для сохранения контекста для столбцов, связанных с временем, можно использовать VALUES:

FullLastYearQuantityTimeRelatedOverride =
CALCULATE ( [Total Quantity], PARALLELPERIOD ( 'GregorianWithWorkingDay', -1, YEAR ), VALUES('Date'[IsWorkingDay]) )

В этом случае FullLastYearQuantityTimeRelatedOverride возвращает те же результаты, что и FullLastYearQuantity.

Conclusion

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

Использование DATEADD с календарями

Функция DATEADD имеет определенные параметры, которые позволяют точно контролировать, как перемещения выполняются, если выборка находится на более детальном уровне, чем уровень сдвигов, указанный параметром interval в DATEADD. Это происходит, например, если вы отображаете данные на уровне даты, но присвойте interval параметру DATEADD значение MONTH. Например, в григорианском календаре при смещении периода, который охватывает с 3 марта по 10 марта, на месяц, это приведет к 3 по 10 апреля. Однако, поскольку месяцы в григорианских календарях имеют разную длину, это может привести к неоднозначностям при изменении. Ниже приведены примеры сценариев на основе григорианского календаря:

Переход от более короткого к более длительному периоду

Например, перемещение на месяц вперед при выборе в феврале, что делает целевой месяц март. Вы можете использовать параметр extension, чтобы повлиять на выполнение смены.

Значение параметра расширения Description Result
precise Это строго сохраняет исходный диапазон дат. 25-28 февраля сдвигается на 25-28 марта.
extended Позволяет окну расширяться к концу месяца. 25-28 февраля сдвигается на 25-31 марта.

Переход от более длинного к более короткому периоду

Например, если выбран март и необходимо переместиться на месяц назад, то целевой месяц — февраль.

Вы можете использовать параметр truncation, чтобы повлиять на выполнение смены.

Значение параметра усечения Description Result
anchored Привязывает результат к последней допустимой дате меньшего месяца. 31 марта сдвигается на 28 февраля (или 29 в високосный год).
blank Если смещенная дата не существует, верните пустое значение. Перемещение 31 марта на один месяц назад возвращает пустое (поскольку 31 февраля не существует).

Рекомендации по работе с аналитикой времени на основе календаря

  • Выполнение вычисления аналитики времени в таблице фактов, которая определяет календарь и подвергается правилам безопасности на уровне строк (RLS) и может привести к непредвиденным результатам.
  • Производительность этой функции предварительной версии не является представителем конечного продукта.
  • Вы еще не можете создавать календари в службе Power BI.
  • Не следует использовать автоматические таблицы даты и времени с пользовательскими календарями.
  • Вы не можете использовать календари с динамическими или составными моделями.
  • Рекомендуется связать только столбцы в календаре, которые необходимо использовать в вычислениях аналитики времени.
  • Календарям подлежат как проверка в реальном времени, так и проверка в автономном режиме. Вы можете сохранить календарь, несмотря на ошибки автономной проверки, но сначала рекомендуется устранить их. Для сохранения необходимо исправить сбои проверки в режиме реального времени.
  • Каждый календарь должен иметь уникальное имя в модели данных
  • Одна таблица может содержать несколько календарей
  • Таблица, содержащая календарь, должна содержать менее 200 столбцов. Если таблица содержит более 20 000 строк, проверки не будут доступны, но вы по-прежнему можете добавить календарь.
  • Календарь должен по крайней мере назначить один первичный столбец категории
  • Календарь может назначать только столбцы из собственной таблицы категориям
  • Каждая категория должна иметь основной столбец и может иметь ноль или более связанных столбцов.
  • DATEADD имеет новые параметры для управления расширением и его поведением, которые не распознаются в IntelliSense.
  • Любой заданный столбец можно сопоставить только с одной категорией
  • Вы не можете вложить функции временной аналитики, использующие календари. Например, следующая инструкция DAX не поддерживается:
ThisIsNotSupported = PREVIOUSDAY ( PREVIOUSMONTH( 'Calendar' ) )

Вместо этого можно сделать следующее:

ThisWorks = CALCULATETABLE ( PREVIOUSDAY ( 'Calendar' ), PREVIOUSMONTH( 'Calendar' ) )

Создание таблицы дат с помощью встроенных средств

В следующих примерах создается таблица дат с 1 января 2010 г. по 31 декабря 2030 г. с помощью Power Query M или DAX. Он содержит следующие столбцы: "Год", "Номер месяца", "Название месяца", "Год месяца", "Квартал", "Квартал года", "День" и "Дата".

Power Query M

let
    StartDate = #date(2010, 1, 1),
    EndDate = #date(2030, 12, 31),
    NumberOfDays = Duration.Days(EndDate - StartDate) + 1,
    DateList = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)),
    DateTable = Table.FromList(DateList, Splitter.SplitByNothing(), {"Date"}),
    AddYear = Table.AddColumn(DateTable, "Year", each Date.Year([Date]), Int64.Type),
    AddMonthNumber = Table.AddColumn(AddYear, "Month Number", each Date.Month([Date]), Int64.Type),
    AddMonthName = Table.AddColumn(AddMonthNumber, "Month Name", each Date.ToText([Date], "MMMM"), type text),
    AddMonthYear = Table.AddColumn(AddMonthName, "Month Year", each Date.ToText([Date], "MMM yyyy"), type text),
    AddQuarter = Table.AddColumn(AddMonthYear, "Quarter", each "Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddYearQuarter = Table.AddColumn(AddQuarter, "Year Quarter", each Text.From(Date.Year([Date])) & " Q" & Text.From(Date.QuarterOfYear([Date])), type text),
    AddDay = Table.AddColumn(AddYearQuarter, "Day", each Date.Day([Date]), Int64.Type)
in
    AddDay

DAX

DateTable =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2010, 1, 1 ), DATE ( 2030, 12, 31 ) ),
    "Year", YEAR ( [Date] ),
    "Month Number", MONTH ( [Date] ),
    "Month Name", FORMAT ( [Date], "MMMM" ),
    "Month Year", FORMAT ( [Date], "MMM YYYY" ),
    "Quarter", "Q" & FORMAT ( [Date], "Q" ),
    "Year Quarter",
        FORMAT ( [Date], "YYYY" ) & " Q"
            & FORMAT ( [Date], "Q" ),
    "Day", DAY ( [Date] ),
    "Date", [Date]
)

Для получения дополнительной информации и параметров см. таблицы дат.

Дополнительные сведения, связанные с этой статьей, см. в следующих ресурсах: