Как превратить суммесли в суммеслимн (сам придумал только на этапе после Table.Group выполнять Table CombineColumns получая таким образом одномерный ключ, который потом используется в Record.Field)
2. Есть ли возможность ещё сильнее сэкономить производительность, чем использование в итоге функций Table.AddColumn + Record.Field? (они же все равно перебирают большой массив?)
(пример прям в самой записи есть)
https://t.me/pbi_pq_from_tank/193
2. О каком переборе идёт речь? Там прямое обращение к полю 1. Тут в группе пару раз выкладывал вариант с записью записей - как вариант В остальном - см. закреп
А в записи не ищется поле перебором? Тогда второй вопрос снят.
Я неоднократно указывал, что на скорость принципиально влияет длина списка, но не число полей в записи
сколько условий вы в реальности перебираете?
Не менее 8, плюс будет несколько столбцов (~5) содержащих промежуточные суммы для разного набора условий.
Сейчас задача решена последовательными Join что очевидно удручает пользователей.
Производительностью, запрос висит минут 5.
мне сравнивать не с чем, поэтому вариант строго по примеру: let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], typ = Table.TransformColumnTypes(from,{"Марка продукта", type text}), lst = List.Buffer(List.RemoveLastN(Table.ColumnNames(typ),1)), g=(y,z)=>(x)=>Record.Field(z,Text.Combine(Record.FieldValues(Record.SelectFields(x,y)),"@")), f=(tbl,col)=>[ lst1=List.Buffer(List.RemoveItems(lst,{col})), cmb=Table.CombineColumns(tbl,lst1,(x)=>Text.Combine(x,"@"),"Name"), gr=Table.Group(cmb,"Name",{"Value",(t)=>List.Sum(t[тн])}), dict=Record.FromTable(gr), add=Table.AddColumn(tbl,"без "&col,g(lst1,dict))][add], to=List.Accumulate(lst,typ,f) in to
А List.Buffer зачем нужен? Он производительность ускорит?
можете не использовать, если не хотите, а так в танке отдельный пост был
Очень круто, спасибо. Могу попросить комментарий словесный к функции "g = ..." написать?
https://t.me/pbi_pq_from_tank/41
и кстати, если плюнуть на порядок строк и делать именно join - по скорости выходит также let from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], typ = Table.TransformColumnTypes(from,{"Марка продукта", type text}), lst = List.Buffer(List.RemoveLastN(Table.ColumnNames(typ),1)), f=(tbl,col)=>[ lst1=List.Buffer(List.RemoveItems(lst,{col})), gr=Table.Buffer(Table.Group(tbl,lst1,{"без "&col,(t)=>List.Sum(t[тн])})), join=Table.Join(tbl,lst1,gr,lst1)][join], to=List.Accumulate(lst,typ,f) in to
Ммм а есть смысл тогда заморачиваться именно с Record.Field? Я думал он увеличивает скорость обработки запроса .
Порядок строк в итоговой таблице не важен, она будет использоваться через агрегированные значения.
скорость обработки увеличивает хороший алгоритм и приемлемое железо на этом и закончим
И все же - есть преимущества у алгоритма через Record.Field перед алгоритмом через Table.Join?
нету, проста данные нужны правильные, чтобы join не тупил
Обсуждают сегодня