Страницы: 1
RSS
DAX Кол-во повторений встречающееся до определенной даты
 
Всех приветствую. Прошу помощи, я застрял.

Есть таблица с датой и кодом. Код может повторяться  как в рамках одной даты так и в разных датах.
Необходимо посчитать в сколько в каждой дате кодов, которые встречались ранее более 1 раза, но при этом, если код попадается в более позднюю дату, то в старых датах значение пересчитываться не должно.
Повторения кода в рамках одного дня не считаем как повтор. Только если один и тот же код встречается в разных датах
Пример в прикрепленном файле.
Изменено: Dyroff - 17.04.2020 20:08:03
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Доброе время суток.
А почему 15 только 1? Код ББББББ-*/0805 был 7, а код АААААА-*/0804 был 10?
 
Андрей VG, Да, Андрей, Вы правы, это моя невнимательность. 15 числа должно быть 2
Так как  и АААААА-*/0804 и ББББББ-*/0805 встречались ранее.
Изменено: Dyroff - 17.04.2020 19:59:36
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, добрый вечер. Вариант во вложении. Но так  же вопрос по 15-ому числу?
Код
=COUNTX(
   SUMMARIZE('Таблица1';
      'Таблица1'[Дата];[Код];
      "кол-во повторов";
      CALCULATE(
         COUNTROWS('Таблица1');
         FILTER(ALL('Таблица1'[Дата]);
         'Таблица1'[Дата]<=MAX('Таблица1'[Дата]))));
IF([кол-во повторов]>1;[кол-во повторов];BLANK()))
 
Vladimir Chebykin, Спасибо большое, почти то что нужно. По 15 числу должно получиться 2. Сейчас у Вас видимо захватывает код АГГГФЧШ-1/1304 который 2 раза встречается в 15 числе, но повторения в рамках одного дня не должны считаться, только если код встречался ранее в рамках другой даты
Изменено: Dyroff - 17.04.2020 20:06:11
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, я пробегал мимо и заглянул на форум на 15 минут. К сожалению, сейчас не смогу поправить решение - только завтра... Пока, может, коллеги поправят мой вариант или свой предложат.
 
Vladimir Chebykin, В любом случае, спасибо большое за помощь и уделенное время.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Чуть поправил предыдущий вариант меры:
Код
=COUNTX(
//создаем виртуальную сводную таблицу с группировкой полей дат и кодов
   SUMMARIZE('Таблица1';
      'Таблица1'[Дата];[Код];
      "кол-во повторов";
//calculate  в виртуальной сводной по каждой дате считает, сколько раз встречаются указанные коды в
//более ранних датах без учета текущей. Условие:'Таблица1'[Дата]<MAX('Таблица1'[Дата])
      CALCULATE(COUNTROWS('Таблица1');
         FILTER(ALL('Таблица1'[Дата]);
            'Таблица1'[Дата]<MAX('Таблица1'[Дата]))
            )
         );
//далее countx просто считает сколько положительных значений получилось больше 0.
// Если использовать, например, SUMX, то это будет сумма повторений, а не частота (кол-во) повторений.
[кол-во повторов]
)
 
Vladimir Chebykin, Супер! Это именно то , что нужно! Спасибо!


Теперь буду пробовать перенести из SUMMARIZE  расчет в столбце, так как на больших объемах будет долго вычислять.

Еще раз спасибо
Изменено: Dyroff - 18.04.2020 12:24:14
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Пожалуйста, обращайтесь!
Попробовал сделать через вычисляемые столбцы - вариант во вложении, хотя по мне такой вариант (который у меня получился) больше на костыль похож!
И еще, когда я стал реализовывать второй вариант, по непонятной мне причине, перестал работать первый вариант с мерой и виртуальной таблицей! Какое-то абсурдное поведение Power Pivot, на мой взгляд. Если у Вас повторяется такая ошибка и Вы тоже не знаете ответ на нее, то я создам отдельную тему на базе этой.
П.С. по поводу скорости вычислений: все зависит от объема исходных данных и объема выводимых строк в итоговую сводную. Например, при парочке миллионов строк исходных данных и при итоговом выводе 30-ти строк (1 месяц к примеру), торможения не должно быть замечено. При итоговых 1000-ах строк в сводной - да, будет заметно долгая обработка меры.
Изменено: Vladimir Chebykin - 18.04.2020 14:00:50
 
У меня так же перестает работать первая мера.

Проверил через Dax Studio  скорость вычисления
Мера 1 = 266 ms
Мера 2 = 84 ms

То есть вторая мера работает на 68 % ,быстрее.
Но странно, что первая рассчитывается но не выводит результат.

Пробовал вынести расчет через ADCOLLUMNS, чтобы испробовать вариант без доп столбцов
Код
COUNTX (
    ADDCOLUMNS (
        SUMMARIZE ( 'Таблица1'; 'Таблица1'[Дата]; [Код] );
        "кол-во повторов"; CALCULATE (
            CALCULATE (
                COUNTROWS ( 'Таблица1' );
                FILTER ( ALL ( 'Таблица1'[Дата] ); 'Таблица1'[Дата] < MAX ( 'Таблица1'[Дата] ) )
            )
        )
    );
    [кол-во повторов]
)


 но в этом случае мера почему-то рассчитывает дольше. Хотя обычно этот метод ускоряет расчет
Изменено: Dyroff - 18.04.2020 14:33:30
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, тут, как говорится, нужно искать баланс. Меры друг с другом сравнивать бессмысленно, потому что Summarize априори проиграет любой простой агрегации. Дело в том, что переводя сложные вычисления в вычисляемые столбцы, Вы грузите оперативную память, что приводит к долгой загрузке модели данных.  Тут только на практике посмотреть как реагирует модель данных при двух вариантах:
1 - без вычисляемых столбцов, но со сложной мерой
2 - с простой мерой, но с вычисляемыми столбцами.
Так же вычисляемые столбцы существенно увеличивают вес файла. При сильно нагруженных моделях данных гуру DAХ-а рекомендуют избавляться от вычисляемых столбцов, а вычисления переводить в меры.
Dyroff, Вы когда тесты на реальной модели данных проведете, отпишитесь, в личку, пожалуйста, какой вариант для Вас оказался лучше?
 
Vladimir Chebykin, Ок, я в понедельник попробую на работе - отпишусь.
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
 
Dyroff, а вы замените summarize на crossjoin, так же шустрее работает. Я же вам вроде даже показывал пример раньше.
Вот горшок пустой, он предмет простой...
 
PooHkrd, Приветствую) Да, вот здесь мы это обсуждали https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=122537

Я попробовал, но почему то в данном случае такая конструкция работает медленнее чем summarize
Нужно бежать со всех ног, чтобы только оставаться на месте, а чтобы куда-то попасть, надо бежать как минимум вдвое быстрее!
Страницы: 1
Наверх