Страницы: 1
RSS
PQ. Оптимизация расчета многофакторного АВС анализа.
 
Добрый день.
Сделал расчет АВС анализа по нескольким показателям.
На больших объёмах данных (около 60т строк) запрос в течение нескольких часов не отрабатывает.
По одному показателю, отрабатывает достаточно быстро.
Прошу оказать помощь в оптимизации.
Спасибо.
 
Неужели нет способа заставить работать данный запрос?

PS. Сформировал 4 запроса (1 запрос - один показатель АВС). Далее выгрузил результаты на листы excel, затем 4 таблицы объединил в одну,
по времени все заняло 15 мин....
Изменено: Neostt - 27.07.2022 13:48:14
 
Neostt, как минимум, Вы очень неоптимального группу считаете. Нужно отсортировать от большего к меньшему и при помощи, к примеру List.Generate или List.Accumulate, найти долю нарастающего итога по каждой строке от общей суммы. И в зависимости от результата группу назначить. У Вас же в запросе для каждого товара пересчитывается таблица с рейтингом товаров. Поэтому и очень медленно :)
Изменено: surkenny - 27.07.2022 14:29:15
 
Цитата
написал:
Neostt , как минимум, Вы очень неоптимального группу считаете. Нужно отсортировать от большего к меньшему и при помощи, к примеру List.Generate или List.Accumulate, найти долю нарастающего итога по каждой строке от общей суммы. И в зависимости от результата группу назначить. У Вас же в запросе для каждого товара пересчитывается таблица с рейтингом товаров. Поэтому и очень медленно
можете помочь с примером, как с помощью  List.Generate или List.Accumulate, найти долю нарастающего итога по каждой строке от общей суммы.....?
а дальше я уже сам....
Спасибо
 
Код
Разобрался....
Изменено: Neostt - 27.07.2022 15:38:22
 
Подскажите, как теперь рассчитать долю нарастающего итога? (значение строки списка gen  разделить на b)
 
Код
 add_index = Table.Group(  
                                tip1,  
                                {"Бренд"},  
                                 {{"tab", (t)=>   
                                 [
//АВС штуки
                                 a=Table.Sort ( t, { { "Реал_шт", Order.Descending } } ),
                                 b=List.Sum(a[Реал_шт]),
                                 lst= List.Buffer(a[Реал_шт]),
                                 n = List.Count(lst),  
                                 gen = List.Generate(()=>[i=0,s=lst{i}],
                                                    (x)=>x[i]<n,
                                                    (x)=>[i=x[i]+1,s=x[s]+lst{i}],
                                                    (x)=>x[s]),
 
Neostt, тут-то уже сложности нет :)
Код
add_index = Table.Group(  
                                tip1,  
                                {"Бренд"},  
                                 {{"tab", (t)=>   
                                 [
//АВС штуки
                                 a=Table.Sort ( t, { { "Реал_шт", Order.Descending } } ),
                                 lst= List.Buffer(a[Реал_шт]),
                                 b=List.Sum(lst),
                                 n = List.Count(lst),  
                                 gen = List.Generate(()=>[i=0,s=lst{i}, sh = s/b, g = if sh <= 0.8 then "A" else if sh <= 0.95 then "B" else "C"  ],
                                                    (x)=>x[i]<n,
                                                    (x)=>[i=x[i]+1,s=x[s]+lst{i}, sh = s/b, g = if sh <= 0.8 then "A" else if sh <= 0.95 then "B" else "C"],
                                                    (x)=>x[g]),
 
surkenny, Круто....
отработало за 20 секунд......
Спасибо
Страницы: 1
Наверх