распилить на 3 по показателю, каждую преобразовать и склеить обратно
Транспонировать, поднять заголовки, отменить свёртывание. Классическая задача на многоуровневый анпивот.
300к IDшников в столбцы - это очень жестокая классика.
Соберите sql-ем готовое. Будет вам light и легко)))
Я ваше решение не смотрел. Ибо нет возможности. Можете прогнать на вашем массиве? А то есть ещё пара идей по оптимизации. Пока Миша не пришел и через Table.FromList всех не уделал.
Если распишите код, то можно.
На пивоте очень сильно задумался, до этого момента вполне шустро действовал. Минуты две висел на этом шаге. Сейчас тест скорости запущу. На курсе Сергея Ожиганова, у которого я учился PQ, говорилось про то, что PQ с пивотом больших массивов не дружит.
Вчерашний вопрос многоуровневого анпивота больших массивов мучил меня весь вечер, поэтому сегодня я решил провести эксперимент. Опыты показали, что торможение происходит на этапе пивота показателей, так что можно считать это тестом скорости пивота PQ в зависимости от размера таблицы. Эксперимент проводился на массиве из файла экселя, будь источником CSV, было бы быстрее, я думаю. Была написана функция, которая берёт массив в 400 тысяч строк, вырезает из него кусочек и лишь после этого обрабатывает. Без Table.Buffer результаты были весьма печальны, поэтому после первой попытки тексты проводились только с буферизацией. Наиболее оптимальный диапазон оказался 500-1000 строк в обрабатываемом блоке с пиком где-то в районе 750 строк. Разница в обработке блоком по 10 тысяч и по 750 оказалась практически в два раза. Так что если планируете делать пивот больших массивов в PQ, режьте буферизованного слона на относительно маленькие кусочки и лишь после этого скармливайте запросу на пивот. @PooHkrd, @kkadikin, @dark_buh, тегаю вас троих как участников вчерашнего обсуждения.
а зачем вообще пайвот? вот по такому принципу не шустрее? let f=(x)=>{{x{0},"категория1",x{1},x{3},x{5}},{x{0},"категория2",x{2},x{4},x{6}}}, from = Table.Buffer(Excel.CurrentWorkbook(){[Name="TData"]}[Content]), lst = Table.ToRows(from), tr = List.Transform(lst,f), cmb = List.Combine(tr), to = Table.FromRows(cmb) in to здесь f написана в лоб, её можно привести в универсальный вид за исходник взял лист с данными в файле примере
13,82 секунды. Более чем в два раза быстрее и в кучу раз короче. Аплодирую стоя. А теперь можете рассказать, как эта магия работает, по шагам?
Смогу вечером, только допилю f и проведу немножко тестов Общий принцип - на списках оно обычно шустрее, не нужно вертеть в памяти абстрактный тип - таблицу, особенно когда она большая
Покопался, общий принцип уловил, но всё равно с большим интересом почитаю ваши пояснения.
Тут как раз неприменима, поскольку с каждого элемента получаем две строки, потому через FromRows, но я ещё подумаю
Ну правильно, причём "большой" начинается уже на тысячах строк
Покопался глубже и понял, что решение относительно узкозаточенное под конкретный формат исходника. Если бы количество категорий менялось от 2 до N, как бы вы решили? Какой-то цикл был бы?
Я написал, что f написана в лоб и её надо допилить, прямым текстом
как в старом анекдоте, после сборки немного обработайте напильником)
Ну покажи как без напильника - делов-то, а я пойду попаботаю
Обсуждают сегодня