Использование значения из строки n + 1 в предыдущей строке - PullRequest
1 голос
/ 05 июля 2019

Для следующей проблемы я нашел решение, которое работает в PowerBI (особая благодарность Marco Vos).Теперь я понимаю, что для моих целей было бы удобнее, если бы этот расчет уже выполнялся PowerQuery.

Что я хочу сделать:

Производственная линия записывает метку времени в файл CSV при запуске события (например, запуск машины, остановка машины и т. Д.).Файл CSV обрабатывается PowerQuery таким образом, что все даты начала доступны в одном столбце таблицы.Столбец называется «Начало события».

Для дальнейшего анализа событий машины, я хотел бы добавить еще один столбец «Конец события», который также содержит дату окончания каждого события.Дата окончания не указывается в файле CSV, но она совпадает с датой начала следующего события.

Так что мне нужно сделать в PoweryQuery, чтобы создать пользовательский столбец, который принимает в каждой строке значение«Дата начала» из следующей строки и поместите ее в текущую строку.

То, что я пробовал:

Я пытался использовать тот же принцип, который был дан Марко Восом в моей исходной теме: Эквивалент Sumif в PowerBI не работает должным образом с функцией DAX

НО PowerQuery сообщает, что не знает таких выражений, как CALCULATE.

Кто-нибудь может поддержать эту тему?

Отредактировано:

КомуЧтобы приблизиться к решению и показать вам проблему, с которой я в данный момент сталкиваюсь, я попробовал следующий код с очень простой таблицей: Таблица содержит порядковый номер от 1 до 10.000 в столбце A («ID»).Чтобы создать столбец B («ID-1»), который должен включать «порядковый номер - 1», я использовал следующий код, основанный на комментарии Оллиса.

Обратите внимание: я не могу загрузить таблицу, потому что каждыйзагрузка заблокирована нашим ИТ-отделом.

let
    Source = Excel.Workbook(File.Contents("C:\Users\machine2321\Desktop\ID_sample.xlsx"), null, true),
    Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"ID", Int64.Type}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
    #"Added ID-1" = Table.AddColumn(#"Added Index", "ID-1", each try #"Added Index"[ID]{[Index]+1} otherwise null),
    #"Removed Index" = Table.RemoveColumns(#"Added ID-1",{"Index"})
in
    #"Removed Index"

Проблема, которую я распознаю, заключается в следующем:

Обработка этой простой таблицы с помощью PowerQuery в Excel занимает уже несколько минут.В исходном запросе я обрабатываю более 2000 файлов, каждый из которых содержит до 1000 событий.Используя описанный выше подход, исходный запрос выполняется часами, прерывается и возвращает сообщение «Неожиданная ошибка» в конце.

Любая подсказка, почему код требует такой большой производительности обработки?

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете добавить столбец индекса, который позволяет сделать ссылку на значение из конкретной строки на основе относительного значения индекса:

#"Added Index" = Table.AddIndexColumn(#"Previous Step", "Index", 0, 1),
#"Added Event End" = Table.AddColumn(#"Added Index", "Event End", each try #"Added Index"[Event Start]{[Index]+1} otherwise null, type datetime),
#"Removed Index" = Table.RemoveColumns(#"Added Event End",{"Index"})

try ... otherwise isвключается, чтобы ошибка не возвращалась для последней строки.

РЕДАКТИРОВАТЬ:

Как вы обнаружили, этот метод является МЕДЛЕННЫМ для больших таблиц.

Там быстреетехника, которая соединяет «сдвинутый» стол с оригиналом.Полное объяснение длинное и подробно описано (с кодом) здесь:

https://www.thebiccountant.com/2018/07/12/fast-and-easy-way-to-reference-previous-or-next-rows-in-power-query-or-power-bi/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...