Страницы: 1
RSS
Выполнение этапов запроса по условию, Power Query
 
Всем добрый день.

Я практически уверен, что данный вопрос уже сотню раз обсудили, но не нашёл ни на каких форумах/ пабликах.

Мне требуется в своём сложном запросе пропустить несколько шагов обработки данных, если список не содержит "null".
На данный момент я применяю if (см. пример ниже), но т.к. мой запрос сложный возникает вопрос: не усложняет ли запрос выполнение этапов до применения if ?
Код
let
    Lst = { 1, 2 },
    TblCrt = Table.FromList( Lst, Splitter.SplitByNothing(), null, null, ExtraValues.Error ),

    Clmn2 = Table.AddColumn( TblCrt, "Column2", each "" ),
    Rplc_ = Table.ReplaceValue( Clmn2, "", "new", Replacer.ReplaceValue, {"Column2"} ),

    ChngTp = if List.Contains( Lst, null ) then Table.TransformColumnTypes( Rplc_, { { "Column1", type number } } ) else 
        Table.TransformColumnTypes( TblCrt, { { "Column1", type number } } )

in
    ChngTp
Может этапы запроса "Clmn2", "Rplc_" стоит выполнять условной функцией? Но как? Не понимаю.
Файл пример, на всякий случай, прилагаю.
 
Цитата
Виталий написал:
не усложняет ли запрос выполнение этапов до применения if
Усложнит с точки зрения кол-ва вычислений или с точки зрения, что некомпактным и раздутым становится код?
Если первое, то, меня поправят если не прав, вроде как если Ваше условие if не выполнится, то шаги Clmn2, Rplc_ вообще не будут считаться, если они в дальнейших шагах не задействованы. Т.к. M использует ленивые вычисления, ниже по ссылке можно почитать про это.
https://baguzin.ru/wp/yazyk-m-power-query-paradigma/
А так можно и в функцию завернуть эти шаги, но вроде ничего с точки зрения производительности это не даст. Надо перечитать статью еще раз, что-то там было про это  8)
 
whateverlover, здравствуйте.


Во-первых, с материалом по ссылке ознакомился. Спасибо!

Во-вторых, для тупых. Что если после "ChngTp" будут следовать ещё шаги не зависящие от "Clmn2", "Rplc_" ? Запрос всё равно не будет вычислять  "Clmn2", "Rplc_" ? Просто мне показалось, что если if применяется внутри кода let .. in, то он прорабатывает оба условных значения.
 
Виталий, а Вы пробовали взять очень большие таблицы и посмотреть разницу во времени обновления с наличием null и отсутствием? :)
Для того, чтобы понять, что будет вычисляться, самостоятельно попробуйте пройти по пути от результата до самого начала: чтобы вычислить ChngTp, нужно вычислить Lst и, если он содержит null, то вычислить TblCrt. Все.
Цитата
Виталий написал:
если if применяется внутри кода let .. in,
Вот это вообще не понял. let .. in - синтаксический сахар. Можно изменить Ваш код на эквивалентный
Код
[
    Lst = { 1, 2 },
    TblCrt = Table.FromList( Lst, Splitter.SplitByNothing(), null, null, ExtraValues.Error ),
 
    Clmn2 = Table.AddColumn( TblCrt, "Column2", each "" ),
    Rplc_ = Table.ReplaceValue( Clmn2, "", "new", Replacer.ReplaceValue, {"Column2"} ),
 
    ChngTp = if List.Contains( Lst, null ) then Table.TransformColumnTypes( Rplc_, { { "Column1", type number } } ) else 
        Table.TransformColumnTypes( TblCrt, { { "Column1", type number } } )
 
][ChngTp]

Но ничего не поменяется.
 
Виталий, давайте проведем эксперимент, добавим шаг который заставляет PQ задуматься.
Список содержит null

Список НЕ содержит null

В первом случае можете не дождаться конца выполнения, во втором - мгновенно. Если бы if проверял все условия и вложенные в него шаги, то в обоих случаях бы запрос отрабатывал продолжительное время.
Изменено: whateverlover - 28.09.2022 15:56:14
 
Цитата
Виталий написал:
Просто мне показалось, что если if применяется внутри кода let .. in, то он прорабатывает оба условных значения
Код прорабатывается до первого выполнения условия.
В коде видно что ответ по первому выполненному условию
Код
let
    a = 5,
    Custom1 = let b = a, c= if b<3 then "<3" else if b<9 then "<9" else if b<6 then "<6" else "--" in c
in
    Custom1
 
whateverlover, Ваш пример запроса, мне всё пояснил

Большое спасибо!!! surkenny и Михаил Л, тоже спасибо за отзывчивость!
Страницы: 1
Наверх