Приветствую Вас, дорогие друзья, с Вами Будуев Антон. В этой статье мы рассмотрим, пожалуй, самую загадочную и трудно понимаемую функцию языка DAX — EARLIER.
Сразу скажу, что для полного понимания работы этой функции одной статьи недостаточно, так как для ее понимания, прежде нужно целиком и полностью разобраться с контекстами в DAX, а конкретнее, с пониманием контекста строки. И только потом уже изучать функцию EARLIER, входящую в Power BI (PoverPivot).
Но, все же, в рамках этой одной статьи, мы постараемся хоть как-то приблизиться к пониманию функции EARLIER и разобрать конкретный пример ее работы.
Для Вашего удобства, рекомендую скачать «Справочник DAX функций для Power BI и Power Pivot» в PDF формате.
Если же в Ваших формулах имеются какие-то ошибки, проблемы, а результаты работы формул постоянно не те, что Вы ожидаете и Вам необходима помощь, то записывайтесь в бесплатный экспресс-курс «Быстрый старт в языке функций и формул DAX для Power BI и Power Pivot».
DAX функция EARLIER в Power BI и Power Pivot
EARLIER () — возвращает по указанному в параметрах столбцу, его значение на высших уровнях контекста строки.
Синтаксис:
EARLIER ([Столбец]; Номер Уровня Контекста)
Пример формулы на основе DAX функции EARLIER.
В Power BI Desktop имеется исходная таблица «Продажи Менеджеров», содержащая столбцы [Менеджер] и [Продажи]:
Задача — создать столбец в исходной таблице с рангом каждого менеджера по сумме его продаж относительно продаж других менеджеров. Иначе говоря, нужно пронумеровать каждого менеджера, где 1-й номер — это менеджер, который принес самую максимальную сумму продаж, а 4-й номер — менеджер, который принес самую минимальную сумму продаж.
Давайте писать соответствующую формулу постепенно, шаг за шагом.
Номера рангов в этом столбце мы будем считать при помощи функции COUNTROWS, которая подсчитывает количество строк в таблице. Напишем первый этап нашей формулы:
Ранг Прибыли = COUNTROWS ('ПродажиМенеджеров')
Количество строк мы получили, но, нам нужно, чтобы в каждой строке были номера от 1 до 4, а не значения 4 во всех строках. Для этого, при расчете количества строк в исходной таблице, нам эту исходную таблицу каждый раз (для каждой строки) нужно фильтровать. Например, так:
Ранг Прибыли = COUNTROWS ( FILTER ( 'ПродажиМенеджеров'; [Продажи] >= 530745 ) )
Для фильтрации исходной таблицы мы применили еще одну функцию в языке DAX — FILTER. В качестве фильтра в этой функции мы прописали условие, где продажи должны быть больше или равны 530745.
Результатом выполнения этой функции будут следующие значения:
То есть, при расчете количества строк в исходной таблице у нас эта таблица отфильтровалась до одной единственной строки, которая удовлетворят условию фильтра «[Продажи] >= 530745». И COUNTROWS вывела количество строк, равное 1.
Если мы условие фильтра поменяем следующим образом: «[Продажи] >= 350000», то результат уже будет таким:
В данной ситуации условию фильтра уже удовлетворяют 2 строки и поэтому, COUNTROWS вывела количество строк исходной таблицы 2.
Причем имеется интересный факт из этих двух выше приведенных примеров: когда мы фильтровали таблицу по условию «[Продажи] >= 530745» (а это максимальная сумма) — то результатом подсчета строк было значение 1, когда условие изменили на «[Продажи] >= 350000» (а это вторая по величине сумма), результат подсчета строк был уже 2. И это уже похоже на то, что нам нужно, то есть ранг менеджеров по прибыли.
Из того факта, который я выше описал, получается, что нам нужно для расчета ранга для каждой конкретной строки в условии фильтра столбец [Продажи] сравнивать с этим же столбцом [Продажи] в этой же конкретной строке. Давайте попробуем написать такую формулу:
Ранг Прибыли = COUNTROWS ( FILTER ( 'ПродажиМенеджеров'; [Продажи] >= [Продажи] ) )
Но, к сожалению, у нас ничего не получилось:
Почему так? Потому что, когда формула считала значение для 1 строки (менеджер Петров), то DAX видел только одну эту строку. И в столбце [Продажи] было только одно значение 120000. Но, как только DAX спустился внутрь самой формулы до функции FILTER, то эта функция, прежде чем фильтровать, возвратила полную исходную таблицу и в условие фильтра уже был подан полный столбец [Продажи].
Это эффект, так называемого уровня контекста строки. Изначально был первый уровень контекста строки, но внутри формулы функция FILTER создала второй уровень контекста строки и DAX про первый уровень полностью «забыл».
! — Еще раз повторюсь, что для полного понимания работы функции EARLIER для начала нужно очень хорошо понимать контексты строк в DAX и уровни этих контекстов. Что, к сожалению, в рамках этой одной статьи рассмотреть просто невозможно.
Исходя из контекстов строк языка DAX, в условии фильтра столбец [Продажи], находящийся на втором уровне контекста строки, сравнивался с этим же столбцом [Продажи] опять же на втором уровне контекста строки, а нужно, чтобы возвратилось значение столбца [Продажи] с первого уровня контекста строки.
А это, как раз таки, может сделать, рассматриваемая в этой статье, функция EARLIER. Исправим нашу формулу, добавив в нее функцию EARLIER:
Ранг Прибыли = COUNTROWS ( FILTER ( 'ПродажиМенеджеров'; [Продажи] >= EARLIER ([Продажи];1) ) )
В первый параметр функции EARLIER мы прописали столбец [Продажи], по которому нужно вернуть значения из верхнего уровня контекста строки. Во втором параметре мы прописали значение 1, то есть, значение нужно вернуть из этого столбца на 1 уровень контекста строки выше.
И вот теперь, все заработало как надо:
Почему? Потому, что EARLIER возвратила значение столбца [Продажи] из контекста строки на уровень выше. И значения столбца [Продажи] на втором уровне контекста строки, созданного функцией FILTER, сравнивались с единственным значением столбца [Продажи] первого уровня контекста строки, который был создан самой исходной таблицей.
Понимаю, что сходу, прочитав эту статью, понять смысл EARLIER у Вас может сразу не получится. Попробуйте смоделировать все примеры, которые мы рассматривали в этой статье, самостоятельно. Шаг за шагом. Тогда, думаю, понимание смысла функционирования EARLIER к Вам должно прийти.
На этом, с разбором DAX функции EARLIER в Power BI и Power Pivot, в этой статье все.
Пожалуйста, оцените статью:
Успехов Вам, друзья!
С уважением, Будуев Антон.
Проект «BI — это просто»
Если у Вас появились какие-то вопросы по материалу данной статьи, задавайте их в комментариях ниже. Я Вам обязательно отвечу. Да и вообще, просто оставляйте там Вашу обратную связь, я буду очень рад.
Также, делитесь данной статьей со своими знакомыми в социальных сетях, возможно, этот материал кому-то будет очень полезен.
Понравился материал статьи?
Добавьте эту статью в закладки Вашего браузера, чтобы вернуться к ней еще раз. Для этого, прямо сейчас нажмите на клавиатуре комбинацию клавиш Ctrl+D
Антон огромное спасибо!
Данная функция используется только для чисел?
Если да, то есть что то подобное для текстовых значений текущей строки в таблице?
Есть необходимость применять фильтр и к текстовым значениям!
Андрей, пожалуйста.
Нет, функция EARLIER применяется не только для чисел, она используется для любых данных. То есть, эта функция возвращает любые данные из внешнего контекста строки
Вопрос.
На один уровень выше (и то, что один, задается), значит можно два три и т.д. уровней?
Что создает дополнительные уровни в строке?
Каждое вхождение функции фильтр?
Или создание нового уровня требует специальной функции?
Да, Александр, в параметрах можно задавать количество уровней. Уровни создают функции, которые в своей работе создают виртуальные таблицы и выполняют операции по каждой строке этой виртуальной таблицы (Filter, SUMX… и др итерационные функции). При вложении одной такой функции в другую и создаются новые уровни контекста строк.
Подробно уровни и контексты DAX мы будем изучать в обоих частях курса: https://biprosto.ru/kurs/dax-kurs-free
НУ ты крутой!!!
))