Здравствуйте, уважаемое сообщество! Помогите пожалуйста решить задачу. У меня есть запрос Power Query. В нем сформирован последний столбец Old Timestamp (см. приложенный скриншот), где в каждой ячейке столбца хранится число секунд от начала события. Мне нужно вычислить разницу между текущим и предыдущим значением. На скриншоте, к примеру, нужно посчитать дельту между второй строкой и первой как 2719-2585=134, и полученный результат сохранить во второй ячейке нового столбца, который надо добавить в конец таблицы. Но это не главная задача. Главная - это посчитать дельту. Я это уже сделал в умной таблице, в которую возвращается результат запроса - там это выглядит как "=[@[Old Timestamp]]-K2", "=[@[Old Timestamp]]-K3" и т.д. автозаполнением до конца столбца. Это работает, но хотелось бы решить эту задачу сразу внутри запроса Power Query, чтобы не разбивать процесс вычислений на части внутреннюю (запрос) и внешнюю (обработка результатов запроса).
Как в запросе Power Query в колонке посчитать разницу между числом текущей строки и предыдущей, и результат (дельту) поместить в новую колонку?
22.05.2018 12:15:29
|
|
|
|
22.05.2018 12:23:49
Смотрите пример, если что не понятно - спрашивайте.
Изменено:
Вот горшок пустой, он предмет простой...
|
|||
|
|
22.05.2018 12:55:43
О да! Спасибо большое! Это то, что нужно! Задача решена.
|
|
|
|
22.05.2018 15:42:34
Извините, но по скриншотам я гадать не умею.
Подозреваю что это произошло после разворачивания столбца с предыдущими значениями при слиянии по двум столбцам индексов. Для этого перед их удалением попробуйте сортировать массив по одному из них.
Изменено:
Вот горшок пустой, он предмет простой...
|
|
|
|
22.05.2018 15:44:39
Для решения проблемы пришлось ввести сортировку по первому индексу перед тем, как удалять столбцы с промежуточными данными. После введения сортировки PQ стал возвращать результат в таблицу в правильной последовательности:
Изменено: |
|
|
|
22.05.2018 17:24:45
P.S. А то, что в моем случае с числами не отработало так, как в вашем примере с датами, я списываю на особенности работы Excel и PQ с другими типами данных в автомате, когда юзер не задал каких-то доп. критериев. С датой на автомате прокатило, а с числами - нет. Ну так мы ручками заставили PQ отсортировать строки в правильной последовательности, раз он автоматом не додумался ![]()
Изменено: |
|||
|
|
22.05.2018 17:30:05
PooHkrd, O_o элегантно. Спасибо!
|
|
|
|
22.05.2018 17:34:48
Илья Демид, если что, мопед не мой - это я все у АндрейVG понабрался.
GrayMagellan, я ничего не предъявлял, просто по скриншотам правда не умею ![]() А вообще при слиянии сортировка всегда слетает, подозреваю что массив сортируется по ключевому полю таблицы из которой вы тянете столбцы. Но это догадки сам не проверял.
Вот горшок пустой, он предмет простой...
|
|
|
|
22.05.2018 18:17:50
![]() |
|||
|
|
23.05.2018 09:25:41
Ну, я ж про прием с двумя индексами. У вас только Join, только хардкор.
![]()
Изменено:
Вот горшок пустой, он предмет простой...
|
|
|
|
23.05.2018 22:58:40
Сделал еще один вариант без Join-ов. PooHkrd, с Вашего позволения, в том же файлике.
Pravé bohatství se skrývá uvnitř
|
|
|
|
24.05.2018 06:26:16
Дешевле уж тогда rList = Table.ToRecords lList = {null} & rList combo = List.Zip({lList, rList}) calc = List.Transform(combo, ....) Далее, думаю понятно. P. S. За что вы так не любите Join? |
|||
|
|
24.05.2018 08:31:00
Андрей VG, Join люблю, умею и практикую, как говорится. А вот List.Generate хотелось в деле попробовать, поэтому выложил (чего добру пропадать). Спасибо за замечание)
P.S. А Вы с высоты опыта не посоветуете, как лучше замерять производительность в PQ? Просто пробовать на большом массиве или есть поинтереснее способы?
Pravé bohatství se skrývá uvnitř
|
|
|
|
24.05.2018 08:37:08
В Power BI Desktop - секундомером ![]() Судя по обсуждениям коллег, в силу ленивых алгоритмов выполнения, фактически не возможно получить достоверные данные по времени со стороны PQ. Может я не прав, коллеги подправят.
Изменено: |
|||||
|
|
24.05.2018 09:11:53
Если интересно, то
Вот горшок пустой, он предмет простой...
|
|
|
|
24.05.2018 12:40:12
![]()
F1 творит чудеса
|
|||
|
|
24.05.2018 13:40:49
Ну, это ещё не совсем. Вот если бы ещё Table.SelectRows был задействован с сортировкой для поиска ближайшей меньшей даты, тогда да... |
|||
|
|
24.05.2018 13:57:24
![]() Джойны рулят, пробовал при расчете значений в столбцах использовать работу со списками безо всяких List.Generate, только комбинацию List.Zip и List.Sum так в итоге табличка на 46 тыс строк считается 10 минут. По факту в каждой ячейке рассчитывается СУММПРОИЗВ двух списков по 5 элементов. один из списков генерится один раз за время запроса и кладется в буфер, второй генерится из значений 5 столбцов для каждой строки. Когда банально приджойнил забуферизованный список в виде столбцов и прописал простую формулу что куда умножить и с чем сложить время расчета снизилось до 6-7 минут. Не исключаю, конечно, что это я там нагородил чего, но как бы нагородил я тогда в обоих вариантах расчетов, а с джойном работает быстрее. Но, к сожалению в работе оставить пришлось вариант со списками, т.к. они динамически меняют свой размер, и прописать формулу обработки списка в этом случае гораздо проще, чем продумывать все варианты вывода непонятного заранее количества столбцов и как для них всех писать формулы с расчетами.
Изменено:
Вот горшок пустой, он предмет простой...
|
|||
|
|
24.05.2018 16:12:32
![]() ![]() ![]() Что-то там вы намудрили, или не про всё рассказали
Время обновления таблицы на листе (50.000 строк), 100 рефрешей таблицы, секунд: Медиана 1,03515625 Среднее 1,0319921875
F1 творит чудеса
|
|||||
|
|
25.05.2018 09:26:03
Да мне тут Андрей тоже уже указал, что я намудрил - буду разбираться поэтапно со своим кодом теперь.
Вот горшок пустой, он предмет простой...
|
||||
|
|
|||
Читают тему