Страницы: 1
RSS
Функции DAX, которые ведут себя неоднозначно., баг или так было задумано MS?
 
Собственно по итогам этогам этой темы
DAX. Суммирование значений за определённый диапазон дат..

Иногда я формирую таблицу с календарем используя дату окончания TODAY()
Код
CALENDAR( DATE(2020,1,1), TODAY() )
Пытаясь добавить конец квартала функцией ENDOFQUARTER для такого календаря - дата конца квартала возращается со значением "крайней" даты в календаре  


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


С другой стороны значение которое вернет функция EOQ может выдавать не те ожидаемые нами даты



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

Пока у меня решение одно - создавать календарь до конца года
Код
CALENDAR( DATE(2020,1,1), DATE( YEAR( TODAY() ), 12, 31 ) )
 
Если почитать документацию, то всё здесь логично.

К тому же, такие функции обычно являются syntax sugar для других, более тяжеловесных формул, как, например, приведено в справке по ENDOFQUARTER
Цитата
ENDOFQUARTER filters <Dates> into a 1-row, 1-column table that shows only the latest date, in the entire <Dates> column devoid of all filters, that is in the same year and quarter as the latest visible date in <Dates>.
Поэтому если столбец дат заканчивается сегодня, вы не можете получить дату, которой там нет.
Во-вторых, добавляя столбец таким образом, вы всегда получите последнюю имеющуюся дату, для любого квартала, года и т.п. - вы не включаете перенос контекста текущей даты, а аргумент ENDOFQUARTER - это столбец, а не единичное значение даты.

DATESINPERIOD возвращает диапазон дат, это верно, но The result table includes only dates that exist in the dates column. Думаю, раз вы ей скармливаете отсутствующую в календаре дату, она и не хочет ничего считать.
Цитата
DrillPipe написал:
может выдавать не те ожидаемые нами даты
Согласитесь, наши ожидания - не наша проблема, хотя я вижу здесь микробагу.

В приведенном примере я и не понимаю, почему вы хотите увидеть 13 августа - Квартал = 1 июля. Потому что это начало квартала? Но вы не просили начало квартала, вы просили вычесть квартал. Поэтому там скорее ожидаешь увидеть 14 мая. Например, если задать ей
Код
= DATESINPERIOD('Calendar'[Date],MAX('Calendar'[Date])-1,-1,QUARTER)
то в календаре, закрытом 13 августа, первая дата возвращается 13 мая.

Цитата
DrillPipe написал:
нужно будет шаманить с другим вариантом получения даты конца квартала.
в той теме я привел еще несколько вариантов получения даты конца квартала

Цитата
DrillPipe написал:
нужно будет шаманить с другим вариантом получения даты конца квартала.
Самое правильное решение.
Многие функции Time Intelligence в DAX работают правильно только при наличии полного (без пропусков) календаря, начинающегося в первый день года и заканчивающегося в последний день года. Иногда это описано в документации напрямую, иногда нет, но лучше всего держать это за правило.
F1 творит чудеса
 
Максим Зеленский,
спасибо за  разъяснения.

Для EOMONTH реализовано по другому в MS.
Может вернуть дату конца месяца даже при отсутствии таковой в календаре.
 
https://docs.microsoft.com/ru-ru/power-bi/guidance/model-date-tables
это рекомендации для Power BI, но они точно так же должны использоваться и в Excel:
Цитата
Для работы с функциями логики операций со временем выражений анализа данных (DAX) необходимо соблюдать предварительное требование к модели: в модели должна иметься хотя бы одна таблица дат. Таблица дат — это таблица, которая соответствует следующим требованиям:
  • Она должна иметь столбец типа данных дата (или дата и время), называемый столбцом даты.
  • Столбец даты должен содержать уникальные значения.
  • Столбец даты не должен содержать ПУСТЫЕ ЗНАЧЕНИЯ.
  • В столбце даты не должно быть отсутствующих дат.
  • Столбец даты должен охватывать полные годы. Год не обязательно должен быть календарным (январь–декабрь).
  • Таблица дат должна быть помечена как таблица дат.
Некоторые функции Time intelligence могут работать и без полного календаря, но можно внезапно нарваться.

EOMONTH это не совсем функция Time Intelligence. В официальной классификации она относится к функциям Даты и времени, а не к функциям логики операций со временем (time Intelligence).
Функции даты и времени очень похожи на функции работы с датами Excel (не удивлюсь, если они были портированы оттуда). По крайней мере, их вводили в DAX вместе с другими "эксельными" функциями для "привычности"
F1 творит чудеса
Страницы: 1
Наверх