Страницы: 1
RSS
PQ.Подставить значение из другой таблицы по условию
 
Добрый день знатокам PQ как из одной таблицы подставить значение из другой таблицы по условию.  join не получилось  
 
nacimjon,
1. А где попытки-то? :)
2. В цене петрухи, видимо, ошиблись в примере.
3. Вариант 1:
Код
let
  src = Excel.CurrentWorkbook(){[ Name = "stock" ]}[Content] & Excel.CurrentWorkbook(){[ Name = "price" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date }, { "Кол-во", Int64.Type }, { "Цена", type number } } ),
  group = Table.Group (
    typed,
    { "Наименование" },
    {
      {
        "table",
        ( eachProduct ) =>
          [
            sort     = Table.Sort ( eachProduct, { { "Дата", Order.Ascending }, { "Кол-во", Order.Ascending } } ),
            fillDown = Table.FillDown ( sort, { "Цена" } ),
            filter   = Table.SelectRows ( fillDown, each ( [#"Кол-во"] <> null ) )
          ][filter]
      }
    }
  ),
  combine = Table.Combine ( group[table] )
in
  combine

4. Вариант 2 (с сохранением порядка строк, как в источнике):
Код
let
  src = Table.AddIndexColumn ( Excel.CurrentWorkbook(){[ Name = "stock" ]}[Content], "Индекс", 1, 1 )
    & Excel.CurrentWorkbook(){[ Name = "price" ]}[Content],
  typed = Table.TransformColumnTypes ( src, { { "Дата", type date }, { "Кол-во", Int64.Type }, { "Цена", type number } } ),
  group = Table.Group (
    typed,
    { "Наименование" },
    {
      {
        "table",
        ( eachProduct ) =>
          [
            sort     = Table.Sort ( eachProduct, { { "Дата", Order.Ascending }, { "Кол-во", Order.Ascending } } ),
            fillDown = Table.FillDown ( sort, { "Цена" } ),
            filter   = Table.SelectRows ( fillDown, each ( [#"Кол-во"] <> null ) )
          ][filter]
      }
    }
  ),
  combine = Table.Combine ( group[table] ),
  sort = Table.Sort ( combine, { { "Индекс", Order.Ascending } } ),
  removeIndex = Table.RemoveColumns ( sort, { "Индекс" } )
in
  removeIndex
 
Как вариант. У коллеги, скорее всего быстрее работать будет
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Измененный тип" = Table.TransformColumnTypes(Источник,{{"Дата", type date}, {"Наименование", type text}, {"Кол-во", Int64.Type}}),
    Пользовательская1 = Table.AddColumn(#"Измененный тип", "Цена", each Цены, type table),
    select = Table.ReplaceValue(Пользовательская1, each [Цена], each let
a = [Наименование],
a1 = [Дата],
b = Table.SelectRows([Цена], each [Наименование]=a and [Дата]<=a1),
c = Table.Sort(b, {"Дата", Order.Ascending}),
d = Table.Last(c)[Цена]
in
d,
Replacer.ReplaceValue, {"Цена"})
in
    select
 
Andrey_S, как нам писал PooHkrd, #3 - это наиболее быстрый способ. Проверено.
Вообще, я перестал использовать Table.ReplaceValue из-за тормознутости. Только если значение1 на значение2 заменить нужно (к примеру, null на 0).
Намного быстрее работает конструкция:
Код
  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 )
  )
Изменено: surkenny - 18.01.2022 16:35:41
 
surkenny,  спасибо за решение сработало четко второй вариант цены поставлены четко по дате,Andrey_S не понял ваше решение вернул таблицы(цены)
 
surkenny, а последний пост Михаила не пробовали еще? Этот способ, по идее еще быстрее работать должен.
Вот горшок пустой, он предмет простой...
 
Цитата
PooHkrd написал:
последний пост Михаила не пробовали еще?
даже не видел :) Можно ссылку?
Изменено: surkenny - 18.01.2022 17:17:29
 
surkenny, дык.
Вот горшок пустой, он предмет простой...
 
PooHkrd,    как применить метод Михаила а то массив данных большой
 
Цитата
написал:
Намного быстрее работает конструкция :
что то не получилось? применть
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    Измененный = Table.TransformColumnTypes(Источник,{{"Дата", type date}, {"Наименование", type text}, {"Кол-во", Int64.Type}}),
    Пользовательский1 = Table.Repeat(Измененный,1),
    tbl = Table.AddColumn(Пользовательский1, "Цена", each Цены, type table),
    replace = Table.FromRecords (Table.TransformRows (tbl, (r) =>Record.TransformFields (r,{{"Цена", ( x ) => if r[Наименование] = x[Наименование] and r[Дата]<=x[Дата] then x[Цена] else x[Цена] }})),Value.Type (tbl) )
in
    replace
 
nacimjon, а способ #2 медленно работает?
Метод Михаила про другое. И #4 не смотрите :)
 
Цитата
surkenny написал:
Этот способ, по идее еще быстрее работать должен.
Потестирую. Но!!!
1. Очень сильно бьет по понятности кода. Не сложности, а понятности :) В TransformRows сразу видно, какое поле меняем и от каких полей зависит.
2. А если еще 5 из 15 столбцов менять?
В общем, если прирост производительности будет большой или под конкретную задачу с огромным числом строк, можно. Но неудобно ппц :)
Изменено: surkenny - 18.01.2022 19:54:41
 
surkenny, Оказывается ваш вариант шустрее спасибо
Изменено: nacimjon - 19.01.2022 05:15:22
Страницы: 1
Наверх