Страницы: 1
RSS
PowerQuery Расчет вариант расчета ввоза товара на склад по выполнению условия остатка, Получить промежуточный результат внутри вычисляемого столбца с учетом вычислений более ранних строк этого же столбца
 
Здравствуйте.
Помогите пожалуйста рассчитать 2 колонки в PowerQuery, и если, возможно, помогите оптимизировать код, который был написан ранее.
Вцелом все колонки кроме последних 2х рассчитал.
Не получается посчитать именно ввоз и остаток, не получается сделать выключатель ввоза, аналогично тому, как это реализовано на формулах.
Также, пожалуйста, если возможно, подскажите как оптимизировать алгоритм расчета накопительных итогов, при больших объемах данных все очень сильно тормозит, и это ОЧЕНЬ мягко говоря.

Если перефразировать, то проблема у меня в том, чтобы ссылаться на вычисление своего собственного столбца на шаг ранее, как это реализовано на формулах в стандартном виде рассчета.
Не пойму как это реализовать, упираюсь в циклическую ссылку. Не пойму как взять сумму вычисляемого столбца, на строчку выше, в конкретном случае, если добавить столбец ввоз, то на сам же столбец, на все строки кроме последней.
Изменено: lostandleft - 25.05.2020 19:48:53
 
Доброе время суток.
Вот с оконными функциями в Power Query - беда. Можно конечно, но лучше в БД их поддерживающую, например в SQLite, а уже оттуда загружать куда надо через Power Query.
 
Андрей VG,
Задача в указанном контексте определена как нерешаемая???????Никаким хитрым ListGenerate ни какой вложенной функцией не решается?????
Что же делать??? Глупо ведь расчеты через промежуточные данные пускать.
Мне нужно бюджет свернуть, все денные считаются в PQ, ожидаемые продажи, валовой доход. Остатки ТМЦ на дату.
Нет никакого решения совсем? PQ ведь не поддерживает без хитрой настроки R никакую выгрузку в БД вообще.
Решения нет????
 
Цитата
lostandleft написал:
нерешаемая???????
Цитата
lostandleft написал:
не решается?????
Цитата
lostandleft написал:
Нет никакого решения совсем?
Цитата
lostandleft написал:
Решения нет????
не многовато негатива для одного сообщения с учётом
Цитата
Андрей VG написал:
Можно конечно
вам просто сказали, что PQ не для этого, но и лак с ногтей ацетоном осч смывают, так что
Скрытый текст
Изменено: buchlotnik - 25.05.2020 21:51:30
Соблюдение правил форума не освобождает от модераторского произвола
 
Цитата
lostandleft написал:
Решения нет????
Почему нет?! Есть. На том самом List.Generate получается самая быстрая версия, я собственно под бедой имел ввиду
Цитата
lostandleft написал:
все очень сильно тормозит, и это ОЧЕНЬ мягко говоря
Сумма с нарастающим итогом более минуты считается для миллиона строк. В VBA и SQL движках с оконными функциями - менее секунды.
Изменено: Андрей VG - 25.05.2020 21:50:20
 
buchlotnik, Я просто в панике! Очень многое уже сделано в PQ.
Простите, Вы не могли бы пояснить алгоритм?
Что происходит в Generate?  Не затруднит ли Вас прочитать цикл по русски?
 
Код
//просто поток сознания, накакой оптимизации
  l1 = ОбщПродажи[ВвозСумм], //список ввозимых сумм
  l2 = ОбщПродажи[ОбщПродажи], //список продаж
  n = List.Count(l1), //число строк
  g = List.Generate(//начинаем генерацию
    ()=>[i=0,//счётчик в нуле
    s=l1{0},//вспомогательная сумма равна первому ввозу
    g=l1{0}],//целевое значение равно первому ввозу
    each [i]<n,//пока счётчик меньше n
    each [i=[i]+1,//счётчик увеличили на единицу
          s=if l2{[i]+1}>[s] then [s]+l1{[i]+1} else [s],//проверили - если общие продажи превысили вспомогательную сумму - увеличиваем её на очередной ввоз, иначе сохраняем
          g=if l2{[i]+1}>[s] then l1{[i]+1} else 0],//и в целевом столбце также прописали сумму ввоза, иначе ноль
    each [g]),//выводим только список целевых значений
  to = Table.FromColumns(Table.ToColumns(ОбщПродажи)&{g},Table.ColumnNames(ОбщПродажи)&{"Решения нет"})
  //поток окончен
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Андрей VG,
Огромное спасибо за уделенное время!
Спасибо за пояснения!
Обычно я пишу на форум, когда уже многие часы думаю над задачей, когда не вижу других решений никаких. Спасибо еще раз.
buchlotnik Еще раз отдельное спасибо за ПОЯСНЕНИЯ!!!
Изменено: lostandleft - 25.05.2020 22:11:40
 
а вообще Пользовательский1 СуммыВвоз и ОбщПродажи также нужно переписать все в один List.Generate - чтобы за одну проходку сделать все оконные вычисления - это будет гораздо быстрее
Изменено: buchlotnik - 25.05.2020 22:26:34
Соблюдение правил форума не освобождает от модераторского произвола
 
buchlotnik, Я понимаю конечно, что это должно быть в разы быстрее, но как это  сделать?
Суммы считаются в отдельном запросе, на каждый месяц они различные. И это выводится не алгоритмами, а ручным вводом. Т.е. грубо менеджер сказал что в июне продажи будут 124 штуки а в июле 55, и так далее.
Связи нет. Поэтому я и беру данные фильтрами. Все это несколько усугубляется тем, что я привел одну таблицу с условным наименованием, а таких наименований порядка 50ти.
Алгоритм нужно немного допилить, завтра подумаю как. Если задать значение S изначально преувеличенным, например 5000, все равно первый проход он выставляет. Т.е. даже если на остаток есть в наличии, все равно первые 620 штук говорит что нужно ввезти.
Изменено: lostandleft - 25.05.2020 22:33:04
 
Цитата
lostandleft написал:
но как это  сделать?
у вас весь пример рассчитан от одного столбца - Продажи, так что собственно мешает делать так:
Скрытый текст
ну и оцените скорость на рабочих данных - просто быстрее вряд ли выйдет, а на 50k этот вариант уже изрядно затупил
Изменено: buchlotnik - 26.05.2020 00:32:57
Соблюдение правил форума не освобождает от модераторского произвола
 
сайт глючит, перезаливаю последний  файл
Скрытый текст
Изменено: buchlotnik - 26.05.2020 18:26:43
Соблюдение правил форума не освобождает от модераторского произвола
Страницы: 1
Наверх