Россия Нет

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

Приветствую Вас, дорогие друзья, с Вами Будуев Антон. В этой статье мы рассмотрим, пожалуй, самую загадочную и трудно понимаемую функцию языка 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
    )
)

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

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

 

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

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

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

Пожалуйста, оцените статью:

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(53 голоса, в среднем: 4.8 из 5 баллов)
[Экспресс-видеокурс] Быстрый старт в языке DAX

 
 
Антон БудуевУспехов Вам, друзья!
С уважением, Будуев Антон.
Проект «BI — это просто»
 
 
 
 

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

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

Автор статьи:
Категория: Язык функций и формул DAX для Power BI и Excel (Power Pivot)

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

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


  1. Андрей:

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

    1. Антон Будуев:

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

  2. Александр:

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

    1. Антон Будуев:

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

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

  3. Олег:

    НУ ты крутой!!!

    1. Антон Будуев:

      ))