Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Power BI предлагает несколько средств для выполнения вычислений на основе времени, которые используют автоматические таблицы дат или таблицы дат, которые вы добавляете.
Мы рекомендуем использовать аналитику времени на основе календаря (предварительная версия), так как она обеспечивает лучшую производительность и самый высокий диапазон гибкости для удовлетворения любого календаря.
В этой таблице сравниваются три средства:
| Tool | Необходимые усилия по настройке | Простота управления | Гибкость | Примечания. |
|---|---|---|---|---|
| Автоматическая дата и время | практически ноль | жесткий | низкий | Увеличивает размер модели из-за нескольких скрытых таблиц дат, созданных |
| Классическая аналитика времени | medium | простой | низкий | Требуется создание таблицы дат, которая предполагает использование григорианского или смещенного григорианского календаря, и испытывает проблемы с производительностью в некоторых специфических сценариях. |
| Аналитика времени на основе календаря | высокий | medium | высокий | Рекомендуется создать таблицу дат, высокую гибкость, лучшую производительность, но увеличить затраты на настройку |
Замечание
Мы советуем избегать использования альтернативных методов темпорального анализа, в частности тех, которые включают добавление дополнительных столбцов в таблицы дат для расчета смещений, за исключением конкретных случаев. Хотя эти подходы могут обратиться к новичкам из-за их простых формул DAX, они, как правило, раздувают семантические модели без необходимости. Это увеличение размера может привести к замедлению обновления данных и снижению производительности отчета по мере роста наборов данных.
Автоматическая дата и время
Функция автоматической даты и времени автоматически создает скрытые таблицы дат для каждого поля даты в модели данных. Дополнительные сведения об этом автоматическом поведении см. в разделе "Применить автоматическую дату и время" в Power BI Desktop.
Замечание
Хотя автоматическая дата и время является удобным вариантом для простых моделей, для более сложных сценариев и более крупных моделей не рекомендуется. Для этих моделей рекомендуется создать выделенную таблицу для повышения гибкости.
Добавление таблицы дат
Для большинства моделей рекомендуется добавить таблицу дат (или более в некоторых сценариях). Многие аналитики данных предпочитают создавать собственные таблицы дат, что хорошо.
Существует несколько способов создания такой таблицы, в том числе:
- Power Query M. Функцию List.Date можно использовать. Пример представлен далее в этом документе.
- DAX. Функции CALENDAR илиCALENDARAUTO можно использовать для создания базовой таблицы вычисляемых дат. Для создания таблицы дат можно также использовать более усложнённую инструкцию DAX. Пример представлен далее в этом документе.
- Внешние инструменты.
- Загрузка из источника, например исходной системы, файла или другой семантической модели Power BI.
Какой вариант лучше всего подходит для вас, зависит от различных факторов и выходит за рамки этого руководства.
Работа с временными вычислениями
Если вы не используете автоматическую дату и время, в 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 .
- В Power BI Desktop перейдите в раздел "Параметры файла > " и "Параметры >> предварительной версии".
- Выберите предварительную версию расширенной аналитики времени DAX .
- Нажмите кнопку "ОК"
- Перезапуск 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' )
Если календарь не определен и возвращается ошибка:
Даже если календарь определен, однако мера может по-прежнему возвращать ошибку. Это происходит, если используемая функция ожидает, что категория будет присутствовать в календаре, а её там нет. Например, 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 выполняет сдвиг на уровне квартала . Функция определяет, что категории "Год " и " Месяц года " могут изменяться в результате изменения столбцов категории квартала . Таким образом, функция очищает контекст фильтра для всех (как первичных, так и связанных) столбцов, помеченных этими категориями.
Другими словами, можно сказать, что категории "Год и месяц года " являются зависимостями категории "Квартал ". И наоборот, можно сказать, что категория "Квартал" зависит от категорий "Год " и "Месяц года ".
Как работает очистка контекста
Эта схема предоставляется для лучшего визуализации зависимостей между различными категориями времени. Каждая категория в этой решетке представляет все столбцы (первичные и связанные) помеченные в эту категорию. Категории подключены к их зависимостям с помощью стрелок. Например, "Месяц" зависит от "Год", "Квартал года", "Месяц квартала", "Квартал" и "Месяц года".
Когда контекст установлен для столбца или связанного с ним столбца, сортировка по которому, отмеченного в календаре, предыдущий контекст фильтра очищается.
- Все зависимости категории X. Это можно рассматривать как все категории, находящиеся выше X.
- Все категории зависят от X и его зависимостей (т. е. от 1. выше). Это можно считать всеми категориями ниже X и всеми категориями начиная с 1 и выше.
Замечание
Очистка контекста происходит в столбцах, помеченных в календаре или связанных столбцах сортировки, независимо от того, задан ли контекст с помощью функций временного интеллекта или иначе.
Столбцы, связанные с временем
Большинство функций аналитики времени, за исключением DATEADD и SAMEPERIODLASTYEAR, будут очищать контекст для всех столбцов, связанных с временем, и связанных столбцов сортировки.
Поведение между календарями
Если в одной таблице определено несколько календарей, эти процессы выполняются для каждого календаря, определенного в таблице. Это включает в себя замечание относительно очистки контекста столбцов, связанных с временем. Другими словами, предположим, что таблица определяет три календаря: Calendar1, Calendar2 и Calendar3. Если контекст фильтра задан для категории "X" в Calendar1, описанные выше процессы выполняются во всех трех календарях.
Пример: фильтрация по параметру "Квартал"
Если контекст фильтра был задан в категории "Квартал", процесс будет следующим образом.
Сначала будут рассмотрены все зависимости категории "Квартал".
Далее будут рассматриваться все зависимые компоненты "Квартала" и его зависимости.
Наконец, конечный результат будет следующим. Все категории, окрашенные в красный цвет, будут лишены предыдущего контекста фильтра, и новый контекст будет установлен на квартал.
Скрипт 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 :
Ниже приведены некоторые примеры строк в таблице Sales :
Таблицы 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 годы:
Все значения для OneYearAgoQuantity и OneYearAgoQuantityTimeRelated за 2025 год соответствуют Total Quantity от точно одного года назад (2024) для того же значения IsWorkingDay.
В этом примере показано, что DATEADD сохраняет контекст для любого столбца в таблице Date, который содержит используемый календарь, независимо от того, помечен он как не связанный или связанный со временем в этом календаре. Так как в определениях мер мы поручили DATEADD вернуться к одному году, единственный столбец, контекст которого был смещен, был столбец, связанный с категорией Года. Независимо от того, был ли столбец IsWorkingDay в календаре помечен как связанный с временем или вообще не помечен, это не изменило результат. Единственная другая функция, которая демонстрирует это поведение, является SAMEPERIODLASTYEAR.
Пример иерархического смещения
Теперь давайте рассмотрим пример, в котором то, помечен ли столбец как связанный с временем или нет, действительно изменяет результат.
Для этого мы создадим ту же визуализацию, что и в предыдущем примере, но на этот раз будем использовать меры FullLastYearQuantity и FullLastYearQuantityTimeRelated.
Это показывает, что 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]
)
Для получения дополнительной информации и параметров см. таблицы дат.
Связанный контент
Дополнительные сведения, связанные с этой статьей, см. в следующих ресурсах: