Dax earlier не работает

EARLIER

Returns the current value of the specified column in an outer evaluation pass of the mentioned column.

EARLIER is useful for nested calculations where you want to use a certain value as an input and produce calculations based on that input. In Microsoft Excel, you can do such calculations only within the context of the current row; however, in DAX you can store the value of the input and then make calculation using data from the entire table.

EARLIER is mostly used in the context of calculated columns.

Syntax

Parameters

Term Definition
column A column or expression that resolves to a column.
num (Optional) A positive number to the outer evaluation pass.

The next evaluation level out is represented by 1; two levels out is represented by 2 and so on.

When omitted default value is 1.

Return value

The current value of row, from column, at number of outer evaluation passes.

Exceptions

Description of errors

Remarks

EARLIER succeeds if there is a row context prior to the beginning of the table scan. Otherwise it returns an error.

The performance of EARLIER might be slow because it theoretically, it might have to perform a number of operations that is close to the total number of rows (in the column) times the same number (depending on the syntax of the expression). For example if you have 10 rows in the column, approximately a 100 operations could be required; if you have 100 rows then close to 10,000 operations might be performed.

This function is not supported for use in DirectQuery mode when used in calculated columns or row-level security (RLS) rules.

In practice, the VertiPaq in-memory analytics engine performs optimizations to reduce the actual number of calculations, but you should be cautious when creating formulas that involve recursion.

Example

To illustrate the use of EARLIER, it is necessary to build a scenario that calculates a rank value and then uses that rank value in other calculations.

The following example is based on this simple table, ProductSubcategory, which shows the total sales for each ProductSubcategory.

The final table, including the ranking column is shown here.

ProductSubcategoryKey EnglishProductSubcategoryName TotalSubcategorySales SubcategoryRanking
18 Bib-Shorts $156,167.88 18
26 Bike Racks $220,720.70 14
27 Bike Stands $35,628.69 30
28 Bottles and Cages $59,342.43 24
5 Bottom Brackets $48,643.47 27
6 Brakes $62,113.16 23
19 Caps $47,934.54 28
7 Chains $8,847.08 35
29 Cleaners $16,882.62 32
8 Cranksets $191,522.09 15
9 Derailleurs $64,965.33 22
30 Fenders $41,974.10 29
10 Forks $74,727.66 21
20 Gloves $228,353.58 12
4 Handlebars $163,257.06 17
11 Headsets $57,659.99 25
31 Helmets $451,192.31 9
32 Hydration Packs $96,893.78 20
21 Jerseys $699,429.78 7
33 Lights 36
34 Locks $15,059.47 33
1 Mountain Bikes $34,305,864.29 2
12 Mountain Frames $4,511,170.68 4
35 Panniers 36
13 Pedals $140,422.20 19
36 Pumps $12,695.18 34
2 Road Bikes $40,551,696.34 1
14 Road Frames $3,636,398.71 5
15 Saddles $52,526.47 26
22 Shorts $385,707.80 10
23 Socks $28,337.85 31
24 Tights $189,179.37 16
37 Tires and Tubes $224,832.81 13
3 Touring Bikes $13,334,864.18 3
16 Touring Frames $1,545,344.02 6
25 Vests $240,990.04 11
17 Wheels $648,240.04 8

Creating a Rank Value

One way to obtain a rank value for a given value in a row is to count the number of rows, in the same table, that have a value larger (or smaller) than the one that is being compared. This technique returns a blank or zero value for the highest value in the table, whereas equal values will have the same rank value and next value (after the equal values) will have a non consecutive rank value. See the sample below.

A new calculated column, SubCategorySalesRanking, is created by using the following formula.

The following steps describe the method of calculation in more detail.

The EARLIER function gets the value of TotalSubcategorySales for the current row in the table. In this case, because the process is starting, it is the first row in the table

EARLIER([TotalSubcategorySales]) evaluates to $156,167.88, the current row in the outer loop.

The FILTER function now returns a table where all rows have a value of TotalSubcategorySales larger than $156,167.88 (which is the current value for EARLIER).

The COUNTROWS function counts the rows of the filtered table and assigns that value to the new calculated column in the current row plus 1. Adding 1 is needed to prevent the top ranked value from become a Blank.

The calculated column formula moves to the next row and repeats steps 1 to 4. These steps are repeated until the end of the table is reached.

The EARLIER function will always get the value of the column prior to the current table operation. If you need to get a value from the loop before that, set the second argument to 2.

Источник

EARLIER

Возвращает текущее значение указанного столбца на проходе внешней оценки упомянутого столбца.

Функция EARLIER полезна для вложенных вычислений, где вы хотите использовать определенное значение в качестве входных данных и вести вычисления на основе этих данных. В Microsoft Excel такие вычисления можно выполнять только в контексте текущей строки. Однако в DAX можно сохранить значение входных данных, а затем выполнить вычисление, используя данные из всей таблицы.

Функция EARLIER в основном используется в контексте вычисляемых столбцов.

Синтаксис

Параметры

Термин Определение
столбец Столбец или выражение, которые разрешаются в столбец.
num (необязательно) Положительное число проходов внешней оценки.

Оценка на один уровень выше представлена значением 1; на два уровня — 2 и т д.

Если значение опущено, по умолчанию используется 1.

Возвращаемое значение

Текущее значение строки на основе столбца по числу проходов оценки.

Исключения

Remarks

Функция EARLIER успешно выполняется, если контекст строки есть до начала сканирования таблицы. В противном случае возвращается ошибка.

Производительность EARLIER может быть низкой, поскольку теоретически она может потребовать выполнения числа операций, близкого к общему количеству строк (в столбце), умноженного на то же самое число (в зависимости от синтаксиса выражения). Например, если в столбце 10 строк, может потребоваться примерно 100 операций. Если у вас есть 100 строк, то число операций может приближаться к 10 000.

Эта функция не поддерживается для использования в режиме DirectQuery при использовании в вычисляемых столбцах или правилах безопасности на уровне строк (RLS).

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

Пример

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

Следующий пример основан на простой таблице, ProductSubcategory, которая показывает общий объем продаж для каждого значения ProductSubcategory.

Итоговая таблица, включая столбец ранжирования, показана здесь.

ProductSubcategoryKey EnglishProductSubcategoryName TotalSubcategorySales SubcategoryRanking
18 Полукомбинезоны 156 167,88 долл. США 18
26 Велосипедные стойки 220 720,70 долл. США 14
27 Парковка для велосипедов 35 628,69 долл. США 30
28 Фляги и кофры 59 342,43 долл. США 24
5 Велосипедные каретки 48 643,47 долл. США 27
6 Тормоза 62 113,16 долл. США 23
19 Ограничения 47 934,54 долл. США 28
7 Цепочки 8 847,08 долл. США 35
29 Чистящие средства 16 882,62 долл. США 32
8 Ведущие звезды 191 522,09 долл. США 15
9 Дерейлеры 64 965,33 долл. США 22
30 Бамперы 41 974,10 долл. США 29
10 Вилки 74 727,66 долл. США 21
20 Перчатки 228 353,58 долл. США 12
4 Рули 163 257,06 долл. США 17
11 Гарнитуры 57 659,99 долл. США 25
31 Шлемы 451 192,31 долл. США 9
32 Гидраторы 96 893,78 долл. США 20
21 Веломайки 699 429,78 долл. США 7
33 Освещение 36
34 Блокировки 15 059,47 долл. США 33
1 Горные велосипеды 34 305 864,29 долл. 2
12 Горные рамы 4 511 170,68 долл. 4
35 Кофры 36
13 Педали 140 422,20 долл. США 19
36 Насосы 12 695,18 долл. США 34
2 Дорожные велосипеды 40 551 696,34 долл. 1
14 Дорожные рамы 3 636 398,71 долл. 5
15 Седла 52 526,47 долл. США 26
22 Шорты 385 707,80 долл. США 10
23 Носки 28 337,85 долл. США 31
24 Чулки 189 179,37 долл. США 16
37 Шины и камеры 224 832,81 долл. США 13
3 Туристические велосипеды 13 334 864,18 долл. 3
16 Туристические рамы 1 545 344,02 долл. 6
25 Жилеты 240 990,04 долл. США 11
17 Колеса 648 240,04 долл. США 8

Создание значения ранга

Одним из способов получения значения ранга для заданного значения в строке является подсчет количества строк в одной и той же таблице, имеющих значение больше (или меньше), чем сравниваемое. Этот метод возвращает пустое или нулевое значение для самого высокого значения в таблице, тогда как равные значения будут иметь одинаковое значение ранга; следующее значение (после одинаковых значений) будет иметь другое значение ранга. См. следующий пример.

Новый вычисляемый столбец, SubCategorySalesRanking, создается с помощью следующей формулы.

Следующие шаги описывают метод вычисления более подробно.

Функция EARLIER возвращает значение TotalSubcategorySales для текущей строки в таблице. В этом случае, поскольку процесс запускается, это первая строка в таблице.

EARLIER([TotalSubcategorySales]) вычисляет значение 156 167,88 долл. США, текущую строку во внешнем цикле.

Функция FILTER теперь возвращает таблицу, где все строки имеют значение TotalSubcategorySales больше 156 167,88 долл. США (это текущее значение для EARLIER).

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

Формула вычисляемого столбца перемещается к следующей строке и повторяет шаги с 1 по 4. Эти действия повторяются до тех пор, пока не будет достигнут конец таблицы.

Функция EARLIER всегда будет получать значение столбца до текущей операции таблицы. Если необходимо получить значение из цикла перед этим, установите второй аргумент равным 2.

Источник

BI — это просто

Простой авторский взгляд на сквозную BI аналитику (разбираем на практике Power BI, Excel, Power Pivot, DAX. и многое другое)

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».

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

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

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

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

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

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

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

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

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

Для фильтрации исходной таблицы мы применили еще одну функцию в языке DAX — FILTER. В качестве фильтра в этой функции мы прописали условие, где продажи должны быть больше или равны 530745.

Результатом выполнения этой функции будут следующие значения:

То есть, при расчете количества строк в исходной таблице у нас эта таблица отфильтровалась до одной единственной строки, которая удовлетворят условию фильтра «[Продажи] >= 530745». И COUNTROWS вывела количество строк, равное 1.

Если мы условие фильтра поменяем следующим образом: «[Продажи] >= 350000», то результат уже будет таким:

В данной ситуации условию фильтра уже удовлетворяют 2 строки и поэтому, COUNTROWS вывела количество строк исходной таблицы 2.

Причем имеется интересный факт из этих двух выше приведенных примеров: когда мы фильтровали таблицу по условию «[Продажи] >= 530745» (а это максимальная сумма) — то результатом подсчета строк было значение 1, когда условие изменили на «[Продажи] >= 350000» (а это вторая по величине сумма), результат подсчета строк был уже 2. И это уже похоже на то, что нам нужно, то есть ранг менеджеров по прибыли.

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

Но, к сожалению, у нас ничего не получилось:

Почему так? Потому что, когда формула считала значение для 1 строки (менеджер Петров), то DAX видел только одну эту строку. И в столбце [Продажи] было только одно значение 120000. Но, как только DAX спустился внутрь самой формулы до функции FILTER, то эта функция, прежде чем фильтровать, возвратила полную исходную таблицу и в условие фильтра уже был подан полный столбец [Продажи].

Это эффект, так называемого уровня контекста строки. Изначально был первый уровень контекста строки, но внутри формулы функция FILTER создала второй уровень контекста строки и DAX про первый уровень полностью «забыл».

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

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

А это, как раз таки, может сделать, рассматриваемая в этой статье, функция EARLIER. Исправим нашу формулу, добавив в нее функцию EARLIER:

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

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

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

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

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

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

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1

(44 голоса, в среднем: 4.8 из 5 баллов)

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

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

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

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

Источник

Читайте также:  Боевой клич не работает
Оцените статью