Страницы: 1
RSS
PQ в условный столбец добавить еще условие
 
здравствуйте. подскажите пожалуйста. в шаге уже есть условие. надо добавит. еще одно. а именно: если  ячейка выше содержит значение "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?
 
Цитата
artyrH написал:
может можно сделать расположение значений столбцов как на скрине?
конечно можно, добавляйте индекс от 0 + еще один индекс от 1 и соединяйте, на форуме полно было подобный примеров
 
Alexey_Spb,  Anton555,  спасибо.
 
Цитата
artyrH написал: пробовал прикрутить и ничего не получилось.
Да, я ошибся - надо было писать так:

Код
(if [Index] > 0 then Таблица[Столбец_Ячейки]{[Index] - 1} else null)

Где таблица - имя таблицы с предыдущего шага, вы можете посмотреть его в расширенном редакторе.

Цитата
Anton555 написал: конечно можно, добавляйте индекс от 0 + еще один индекс от 1 и соединяйте
А зачем так сложно и долго?  
Изменено: Alexey_Spb - 04.02.2019 00:34:50
 
Цитата
Alexey_Spb написал:
надо было писать так
спасибо. я прогуглил обращение из #3 и увидел чего не хватало. прикрутил, пусть с десятого раза, но прикрутил. плохо что нет в PQ явных подсказок. удалишь один токен - другой найдет).
Цитата
Alexey_Spb написал:
так сложно и долго
вот мне так легче и, по моему, быстрее. PQ каждую строку медленно проверяет. если закинуть несколько условий на >14000 строк, то я быстрее сосчитаю до 14 тысяч)
мне легче и сподручнее формулу в excel написать.
 
Цитата
artyrH написал:
легче и, по моему, быстрее
Если вам так удобно, то лучше делать так .

Но насчёт быстрее - надо проверять так как в вашем случае нужно добавить два индексных столбца (скорее всего, эта операция проходит быстрее чем добавление стандартного столбца). Затем вам нужно сделать операцию join, развернуть столбцы, убрать лишние.

Всё будет зависеть от того, как устроена функция объединения внутри pq - внутри неё все равно надо для каждого значения ключа делать выборку. Может, конечно, есть оптимизация для повторяющиеся ключей, но это явно не наш случай.

Все это одной операции добавления столбца, но с функцией вычисляемой на каждой строке таблицы. Тем не менее доберусь до экселя и проверю.  
Изменено: Alexey_Spb - 03.02.2019 15:06:27
 
Alexey_Spb, из того что читал, все гуру в унисон твердят что обращение к ячейкам по их адресам это медленно, и через джойн на больших массивах быстрее. Но есть ещё такая Имке Фельдман, чудесная дама, которая предложила самый быстрый вариант для больших массивов с банальным смещением нужного столбца на строку вверх/вниз и прилеплением получившегося столбца справа. Завтра по копаюсь в закладках на работе дам ссылку.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
все гуру в унисон твердят что обращение к ячейкам по их адресам это медленно
Да, я сейчас проверил, это просто epic fail. На миллионе строк - пара строк в секунду. Жесть  8-0  (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.
Изменено: Alexey_Spb - 04.02.2019 01:04:59
 
PooHkrd, спасибо
let
   Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
   #"Замененное значение" = Table.TransformColumnTypes(Источник,{{"Сведено", type text}, {"Столбец2", Int64.Type}, {"Столбец3", Int64.Type}, {"Столбец4", Int64.Type}}),
   Пользовательская2 = TableReferenceDifferentRow( #"Замененное значение", -1,{"Сведено"}),
   Пользовательская1 = Table.AddColumn(Пользовательская2, "AA", each if Text.Contains([Сведено], "Step") and  Text.Contains([Сведено.Prev], "Excel") then [Сведено] else null)
in
   Пользовательская1
 
Цитата
PooHkrd написал:
Завтра по копаюсь в закладках на работе дам ссылку.
Вот, как и обещал - Быстрый и легкий способ брать значения из следующей или предыдущей строки в  Power Query или Power BI.
О, artyrH, я смотрю вы уже и сами все нашли, только ссылку так спрятали, что я сразу и не разглядел.
Всем настоятельно рекомендую ознакомиться с блогом этой дамы, множество всякого полезного можно накопать.
Изменено: PooHkrd - 04.02.2019 09:13:42
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх