Антон БудуевПриветствую Вас, дорогие друзья, с Вами Будуев Антон. В этой статье мы рассмотрим, пожалуй, самую загадочную и трудно понимаемую функцию языка DAX — EARLIER.

Сразу скажу, что для полного понимания работы этой функции одной статьи недостаточно, так как для ее понимания, прежде нужно целиком и полностью разобраться с контекстами в DAX, а конкретнее, с пониманием контекста строки. И только потом уже изучать функцию EARLIER, входящую в Power BI (PoverPivot).

Но, все же, в рамках этой одной статьи, мы постараемся хоть как-то приблизиться к пониманию функции EARLIER и разобрать конкретный пример ее работы.

Для Вашего удобства, рекомендую скачать «Справочник DAX функций для Power BI и Power Pivot» в PDF формате.

Если же в Ваших формулах имеются какие-то ошибки, проблемы, а результаты работы формул постоянно не те, что Вы ожидаете и Вам необходима помощь, то записывайтесь в бесплатный экспресс-курс «Быстрый старт в языке функций и формул DAX для Power BI и Power Pivot».

А также, подписывайтесь на наши социальные сети. Потому что именно в них, Вам будут доступны оперативно и каждый день наши актуальные фишки, секреты, наработки, примеры, кейсы, полезные советы, видео и статьи по темам сквозной BI аналитики (Power BI, DAX, Power Pivot, Excel…): Вконтакте, Инстаграм, Фейсбук, YouTube.

 

DAX функция EARLIER в Power BI и Power Pivot

EARLIER () — возвращает по указанному в параметрах столбцу, его значение на высших уровнях контекста строки.

Синтаксис:

EARLIER ([Столбец]; Номер Уровня Контекста)

Пример формулы на основе DAX функции EARLIER.

В Power BI Desktop имеется исходная таблица «Продажи Менеджеров», содержащая столбцы [Менеджер] и [Продажи]:

Исходная таблица в Power BI Desktop

 

Задача — создать столбец в исходной таблице с рангом каждого менеджера по сумме его продаж относительно продаж других менеджеров. Иначе говоря, нужно пронумеровать каждого менеджера, где 1-й номер — это менеджер, который принес самую максимальную сумму продаж, а 4-й номер — менеджер, который принес самую минимальную сумму продаж.

Давайте писать соответствующую формулу постепенно, шаг за шагом.

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

Ранг Прибыли = COUNTROWS ('ПродажиМенеджеров')

Подсчет количества строк

 

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

Ранг Прибыли = 
COUNTROWS (
    FILTER (
        'ПродажиМенеджеров';
        [Продажи] >= 530745
    )
)

Для фильтрации исходной таблицы мы применили еще одну функцию в языке DAXFILTER. В качестве фильтра в этой функции мы прописали условие, где продажи должны быть больше или равны 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 уровень контекста строки выше.

И вот теперь, все заработало как надо:

Результат работы формулы в Power BI на основе DAX функции EARLIER

 

Почему? Потому, что EARLIER возвратила значение столбца [Продажи] из контекста строки на уровень выше. И значения столбца [Продажи] на втором уровне контекста строки, созданного функцией FILTER, сравнивались с единственным значением столбца [Продажи] первого уровня контекста строки, который был создан самой исходной таблицей.

Понимаю, что сходу, прочитав эту статью, понять смысл EARLIER у Вас может сразу не получится. Попробуйте смоделировать все примеры, которые мы рассматривали в этой статье, самостоятельно. Шаг за шагом. Тогда, думаю, понимание смысла функционирования EARLIER к Вам должно прийти.

На этом, с разбором DAX функции EARLIER в Power BI и Power Pivot, в этой статье все.

Успехов Вам, друзья!

 

Антон БудуевС уважением, Будуев Антон.
Проект «BI — это просто»

 

 

Присоединяйтесь к нашим социальным сетям

Именно в них оперативно и каждый день Вам будут доступны наши актуальные фишки, секреты, наработки, примеры, кейсы, полезные советы, видео и статьи 

по темам сквозной BI аналитики (Power BI, DAX, Power Pivot, Excel...)

Наша группа Вконтакте Мы в Инстаграме Наша группа в Фейсбук Наш YouTube канал
Наша группа VK
Подписаться на наш YouTube канал
 

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

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

 

Понравился материал статьи?
Избранные закладкиДобавьте эту статью в закладки Вашего браузера, чтобы вернуться к ней еще раз. Для этого, прямо сейчас нажмите на клавиатуре комбинацию клавиш Ctrl+D


Вам это может быть интересно. Другие статьи нашего обучающего портала:


6 thoughts on “DAX функция EARLIER в Power BI и Power Pivot”

  1. Вопрос.
    На один уровень выше (и то, что один, задается), значит можно два три и т.д. уровней?
    Что создает дополнительные уровни в строке?
    Каждое вхождение функции фильтр?
    Или создание нового уровня требует специальной функции?

    1. Да, Александр, в параметрах можно задавать количество уровней. Уровни создают функции, которые в своей работе создают виртуальные таблицы и выполняют операции по каждой строке этой виртуальной таблицы (Filter, SUMX… и др итерационные функции). При вложении одной такой функции в другую и создаются новые уровни контекста строк.

      Подробно уровни и контексты DAX мы будем изучать в обоих частях курса: https://biprosto.ru/kurs/dax-kurs-free

  2. Антон огромное спасибо!
    Данная функция используется только для чисел?
    Если да, то есть что то подобное для текстовых значений текущей строки в таблице?
    Есть необходимость применять фильтр и к текстовым значениям!

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

* Заполняя форму отправки комментария своими персональными данными (имя, email, сайт и др.), Вы автоматически подтверждаете свое согласие на обработку своих персональных данных