здравствуйте. подскажите пожалуйста. в шаге уже есть условие. надо добавит. еще одно. а именно: если ячейка выше содержит значение "Excel", то условие выполняется и возвращается значение из столбца "Сведено". то есть должно содержаться и "Step" и ячейкой выше "Excel" как добавить еще условие в условный столбец?
Код
= Table.AddColumn(#"Замененное значение", "AA", each if Text.Contains([Сведено], "Step") then [Сведено] else null)
artyrH написал: если ячейка выше содержит значение
Если вам нужно сделать зависимость значения от другой строки в таблице, то все несколько усложняется. Добавьте в таблицу индексную числовую колонку, которая начинается с нуля с увеличением на единицу . Назовите её Index. Тогда обращение в формуле добавления нового столбца к ячейке в предыдущей строке будет таким:
Код
(if [Index] > 0 then [Столбец_Ячейки]{[Index] - 1} else null)
Alexey_Spb, пробовал прикрутить и ничего не получилось. может можно сделать расположение значений столбцов как на скрине? то есть добавить столбец со смещением значений на одну ячейку. есть ли такая возможность у Power query?
спасибо. я прогуглил обращение из #3 и увидел чего не хватало. прикрутил, пусть с десятого раза, но прикрутил. плохо что нет в PQ явных подсказок. удалишь один токен - другой найдет).
вот мне так легче и, по моему, быстрее. PQ каждую строку медленно проверяет. если закинуть несколько условий на >14000 строк, то я быстрее сосчитаю до 14 тысяч) мне легче и сподручнее формулу в excel написать.
Но насчёт быстрее - надо проверять так как в вашем случае нужно добавить два индексных столбца (скорее всего, эта операция проходит быстрее чем добавление стандартного столбца). Затем вам нужно сделать операцию join, развернуть столбцы, убрать лишние.
Всё будет зависеть от того, как устроена функция объединения внутри pq - внутри неё все равно надо для каждого значения ключа делать выборку. Может, конечно, есть оптимизация для повторяющиеся ключей, но это явно не наш случай.
Все это одной операции добавления столбца, но с функцией вычисляемой на каждой строке таблицы. Тем не менее доберусь до экселя и проверю.
Alexey_Spb, из того что читал, все гуру в унисон твердят что обращение к ячейкам по их адресам это медленно, и через джойн на больших массивах быстрее. Но есть ещё такая Имке Фельдман, чудесная дама, которая предложила самый быстрый вариант для больших массивов с банальным смещением нужного столбца на строку вверх/вниз и прилеплением получившегося столбца справа. Завтра по копаюсь в закладках на работе дам ссылку.
PooHkrd написал: все гуру в унисон твердят что обращение к ячейкам по их адресам это медленно
Да, я сейчас проверил, это просто epic fail. На миллионе строк - пара строк в секунду. Жесть (core i5-8250, 8 gb ram)
Код
let
Source = Excel.CurrentWorkbook(){[Name="Query1"]}[Content],
Ai = Table.Buffer(Table.AddIndexColumn(Source, "Index", 0, 1)),
Ac = Table.AddColumn(Ai, "Custom", each Ai{[Index=[Index]-1]}[Query1])
in
Ac
// UPDATED:
Это не недостаток алгоритма, это просто медленный доступ к элементам таблицы.
Если взять вместо обращения к таблицы обращение к списку, сделанному из колонки по номеру элемента (инексу), то операция на миллионе строк выполнется принципиально быстрее (в районе 10 секунд):
Код
let
Source = Excel.CurrentWorkbook(){[Name="Query1"]}[Content],
Ai = Table.AddIndexColumn(Source, "Index", 0, 1),
L = List.Buffer(Ai[Query1]),
Ac = Table.AddColumn(Ai, "Custom", each L{[Index]-1})
in
Ac
Но наверное, действительно самый быстрый способ добавить элемент перед списком, удалить последний и использовать его как новы столбец, о котором указал PooHkrd.