Страницы: 1
RSS
Замена по условию в одной или нескольких записях, PQ
 
Добрый день
Подскажите как реализовать в запросе: замена значений Столбца2 на постоянное значение "7" для записей Столбца1 "q" и "w"
Таблица1 периодически перезаписывается
Изменено: Иван Сергеевич - 14.10.2021 12:11:41
 
Можно так:
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Столбец1", type text}, {"Столбец2", Int64.Type}}),
    #"Replaced Value" = Table.ReplaceValue(
        #"Измененный тип", 
        each [Столбец1],
        7,
        (a,b,c) as number => if b="q" or b = "w" then c else a,
        {"Столбец2"})
in
    #"Replaced Value"
Вот горшок пустой, он предмет простой...
 
Вот такой еще вариант:
Код
let
  src = Table.Buffer ( Excel.CurrentWorkbook(){[ Name = "data" ]}[Content] ),
  typed = Table.TransformColumnTypes ( src, { { "Столбец2", Int64.Type } } ),
  replace = Table.FromRecords (
    Table.TransformRows ( typed, ( r ) => Record.TransformFields ( r, { "Столбец2", each if r[Столбец1] = "q" or r[Столбец1] = "w" then 7 else _ } ) ),
    Value.Type ( typed )
  )
in
  replace
 
 
Спасибо!
 
surkenny, эк, замороченно то получилось. Но шустренько. Здорово. Хотя буфер на очень больших таблицах - вариант спорный.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
Хотя буфер на очень больших таблицах - вариант спорный.
Буфер использовал, чтобы сравнить именно скорость обработок, в реальных запросах не использую. Без первого буфера (загрузки таблицы из excel) первый вариант вообще бесконечно считался;)

Странно, но без буфера в шаге tbl первый вариант заметно проигрывает:

Неужто AddColumn вызывает пересчет предыдущего шага??? Хотя в "рабочих" запросах без буфера этот вариант у меня всегда был быстрее, чем replace.

Понятно, что первый вариант самый простой в освоении;) Но вариант с transform хорош тем, что можно менять сразу несколько столбцов:
Код
let
  src = Table.Buffer ( Excel.CurrentWorkbook(){[ Name = "data" ]}[Content] ),
  typed = Table.TransformColumnTypes ( src, { { "Столбец2", Int64.Type } } ),
  tbl = Table.Repeat ( typed, 10000 ),
  replace = Table.FromRecords (
    Table.TransformRows (
      tbl,
      ( r ) =>
        Record.TransformFields (
          r,
          {
            { "Столбец2", each if r[Столбец1] = "q" or r[Столбец1] = "w" then 7 else _ },
            { "Столбец1", ( x ) => if x = "q" or r[Столбец2] = 5 then x & "!!!" else x }
          }
        )
    ),
    Value.Type ( tbl )
  )
in
  replace
 
О, красиво разложил. Очередное доказательство, что краткость кода в PQ не показатель.
Пускай немного громоздко, зато эффективно.
Спасибо.
Цитата
surkenny написал:
Неужто AddColumn вызывает пересчет предыдущего шага???
Нет, это ваш Table.Repeat подгаживает. В AddColumns как-то итератор странно работает если перед ним есть NestedJoin или Combine, да и с обычным Join он тоже как-то странно работает. Повтор, это ж по сути многократный Combine, поэтому вот так. "Стриминговая семантика", туды ее в качель.
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх