Страницы: 1
RSS
Замена DAX функции EARLIER на аналог
 
Друзья, добрый день!
Прошу совета (помощи), проблема с BI из-за функции EARLIER, в таблице порядка 16к строк, и 3 условия с EARLIER, проблема в долгой загрузке, даже оф. справка microsoft говорит -
Цитата
Производительность EARLIER может быть низкой, поскольку теоретически она может потребовать выполнения числа операций, близкого к общему количеству строк (в столбце), умноженного на то же самое число (в зависимости от синтаксиса выражения). Например, если в столбце 10 строк, может потребоваться примерно 100 операций. Если у вас есть 100 строк, то число операций может приближаться к 10 000.
Кто-нибудь (может быть) знает чем заменить данную функцию?
Спасибо.
 
OblivionR, может вам вот эта тема поможет?
Вот горшок пустой, он предмет простой...
 
Доброе время суток
Цитата
OblivionR написал:
рассчитываю медиану, условно 100 значений назад, 100 вперед
Можете про эксперементировать - сколько будет считаться, если скользящую медиану заменить на среднее?
Updated.
Попытался смоделировать. Создал в Power BI Desktop таблицу
Код
// T16k
let
    lastId = 16000,
    mult = 2 * Number.PI / lastId,
    Source = Table.FromColumns({{1..lastId}}, {"id"}),
    addValue = Table.AddColumn(Source, "value", each 20 * Number.Sin(mult * [id]) + 30 + 5 * (try Number.Random() otherwise null)),
    #"Changed Type" = Table.TransformColumnTypes(addValue,{{"id", Int64.Type}, {"value", type number}})
in
    #"Changed Type"

Запустил создание столбца скользящим окном +/- 200 таким кодом
Код
MW filter = Var curId = 'T16k'[id]
Var windowData = FILTER('T16k'; 'T16k'[id] - 199 <= curId && 'T16k'[id] + 199 >= curId)
Return MEDIANX(windowData; 'T16k'[value])

выполнилось за 14 секунд. Тогда попробовал классикой
Код
MW filter Earlier = CALCULATE(MEDIAN('T16k'[value]); FILTER('T16k'; EARLIER(T16k[id]) >= 'T16k'[id] - 200 && EARLIER('T16k'[id]) <= 'T16k'[id] + 200))

выполнилось за 16 секунд.
Вывод, дело не в EARLIER. Или вы что-то скрываете?
Изменено: Андрей VG - 28.01.2020 21:03:16
 
Андрей VG, PooHkrd, Спасибо большое что откликнулись, я в DAXе пока не силен, поэтому сложно воспринимать, особенно то что сделал Андрей :-)

Код
= ROUND( 
        IF(
            AND([акция]="да";[возврат]="нет");

            min(
                MEDIANX(
                    ADDCOLUMNS(
                        CALCULATETABLE('Продажи';
                                    FILTER('Продажи';[сцепка]=EARLIER([сцепка]));
                                    FILTER('Продажи';[№продаж]<=EARLIER([№продаж]));
                                    FILTER('Продажи';[№продаж]>EARLIER([№продаж])-10);
                                    FILTER('Продажи';AND([акция]="нет";[возврат]="нет")));
                    "ddd";[Сумма]);
                [ddd]);
            [Сумма]);
        [Сумма]);
    0)
Вот сама формула, может с ней станет яснее в чем "лаг".
Цитата
Андрей VG написал:
Вывод, дело не в EARLIER. Или вы что-то скрываете?
Тут вот затрудняюсь ответить, просто с ней работает долго, без неё быстро, как-то так...
Страницы: 1
Наверх