Страницы: 1
RSS
Power Query оптимизация запроса
 
Здравствуйте.

Есть табличка вида:
idcodeПериодДата   началаДата   окончанияСумма
1000000055845Март 201401.11.201503.10.201776   432,65
2000000055845Март   201401.11.201530.04.201882 076,94
3000000055845Март 201410.10.201730.04.201820 023,61
4000000055845Март 201801.11.201503.10.201776 432,65
5000000055845Март 201801.11.201530.04.201882 076,94
6000000055845Март 201810.10.201730.04.201820 023,61
7000000055845Январь 201601.11.201503.10.201776   432,65
8000000055845Январь   201601.11.201530.04.201882 076,94
9000000055845Январь 201610.10.201730.04.201820 023,61
Надо ее отфильтровать и оставить записи с самым последним периодом. В данном случае Март 2018 с 10-10-2017 по 30-04-2018 (выделено).
В принципе вопрос решается этой функцией. Из большой таблицы убрал лишние столбцы (ТаблицаДанныхУсеч). Передаю код счета и индекс строки. Фильтрую по коду счета. Сортирую в обратном порядке, и беру первую ячейку (тут нужный id = 6 получается). Если переданный код и индекс совпадает, получаю тру на выходе, по нему и фильтрую изначальную таблицу.

Код
(code, index)=> 
let
    Источник = ТаблицаДанныхУсеч,
    #"Строки с примененным фильтром" = Table.SelectRows(Источник, each [#"Номер лицевого счета "] = code),
    #"Сортированные строки" = Table.Sort(#"Строки с примененным фильтром",{{"Дата окончания периода взыскания", Order.Descending}, {"Дата начала периода взыскания", Order.Descending}, {"Период образования задолженности по поставщику", Order.Descending}}),
    Индекс = if #"Сортированные строки"{0}[Индекс] = index then true else false
in
    Индекс

Проблема в том, что в файле >37к строк. Такой подход отрабатывает по секунде на строку ~10 часов получается. Файлов два, да еще меняться со временем будут :\
Подбросьте, пожалуйста, идей, как можно оптимизировать процесс.
 
Вариант не очень, хотя на материнке 2009года за 12мин 21тыс строк обработало)
Код
// Таблица1
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Grouped Rows" = Table.Group(Source, {"code"}, {{"a", each let a=_,
    #"Filtered Rows" = Table.SelectRows(a, let latest = List.Max(Source[#"Дата   окончания"]) in each [#"Дата   окончания"] = latest),
    #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", let latest = List.Max(#"Filtered Rows"[#"Дата   начала"]) in each [#"Дата   начала"] = latest),
    #"Filtered Rows2" = Table.SelectRows(#"Filtered Rows1", let latest = List.Max(#"Filtered Rows1"[Период]) in each [Период] = latest),
    #"Kept Last Rows" = Table.LastN(#"Filtered Rows2", 1)
in
    #"Kept Last Rows"}}),
    Custom1 = Table.Combine(#"Grouped Rows"[a])
in
    Custom1

 
Господа, пример в студию! Идея есть:) Без примера лень. Только реальные данные (период-то, вроде, текстовый).
 
Цитата
Михаил Л написал:
2009года за 12мин
На том же 42тыс строк за три мин
Код
// Таблица1
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Grouped Rows" = Table.Group(Source, {"code"}, {{"a", each let a=_,
    #"Filtered Rows" = Table.SelectRows(a, each [#"Дата   окончания"] = List.Max(a[#"Дата   окончания"])),
    #"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each  [#"Дата   начала"] = List.Max(#"Filtered Rows"[#"Дата   начала"])),
    #"Filtered Rows2" = Table.SelectRows(#"Filtered Rows1", each [Период] = List.Max(#"Filtered Rows1"[Период])),
    #"Kept Last Rows" = Table.LastN(#"Filtered Rows2", 1)
in
    #"Kept Last Rows"}}),
    Custom1 = Table.Combine(#"Grouped Rows"[a])
in
    Custom1

Ну и пример(растянуть только надо диапазон)
 
Макрос
 
Михаил Л, думаю у ТС в примере в столбце Период не дата :) Но смысл тот же:
surkenny
Скрытый текст

Михаил Л_remastered Нельзя итератору функцию скармливать, он же каждый раз пересчитывает, скалярное значение нужно дать для сравнения. Подозревал, что запрос будет быстрее чем полное сравнение, но первое подобное решение у Михаила - поэтому имя соответствующее :)
Скрытый текст

На 166 строках:

На 90к строк:
Изменено: surkenny - 31.05.2022 22:33:55
 
В общем я лошара! Перемудрил, затупил и тд. :) Гораздо проще и по времени одинаково с Михаил Л_remastered
Код
let
  Source  = Excel.CurrentWorkbook(){[ Name = "Таблица1" ]}[Content],
  group   = Table.Group ( Source, "code", { "rec", ( t ) => Table.Max ( t, { "Дата окончания", "Дата начала", "Период" } ) } ),
  toTable = Table.FromRecords ( group[rec] )
in
  toTable

Спасибо прекрасному знатоку M :)
 
Цитата
surkenny написал:
Спасибо прекрасному знатоку M
ты с кем там советуешься ? )
 
Цитата
New написал:
ты с кем там советуешься ? )
Пока я, вроде, в своем уме :)
Это была благодарность наставившему меня на путь истинный (не пиву) :)
Изменено: surkenny - 31.05.2022 23:18:25
 
surkenny, просто надо почаще использовать посты прекрасного знатока М в жизни. Для вас же Миша это все в канал и пишет.
Изменено: PooHkrd - 01.06.2022 08:57:43
Вот горшок пустой, он предмет простой...
 
Блистательно, Господа! #7 за секунды решил проблему, как я хотел :)
surkenny, да, период текстовый PQ великолепно конвертит его в дату. Ну и столбец с индексом я добавлял.

Пойду разбираться, как эта магия работает) тоже пытался через группировки решить, но "накликать" не получалось))
Спасибо еще раз!
(файлик, конечно раньше цеплять надо было. извините)
Изменено: Squid - 01.06.2022 09:16:44
 
Цитата
Дмитрий написал:
Пойду разбираться
Приходите, разбирайтесь.
Вот горшок пустой, он предмет простой...
 
Цитата
написал:
 Приходите , разбирайтесь.
Подписался, благодарю)
 
Цитата
surkenny написал:
по времени одинаково с Михаил Л_remastered
мое решение рядом не стоит.
А вот это решение рядом.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    typ = Table.TransformColumnTypes(Source,{{"Период", type date}, {"Дата   начала", type date}, {"Дата   окончания", type date}}),
    gr = Table.Group(typ, "code", {"a", each Table.Max(_,{"Дата   окончания","Дата   окончания","Период"})})[a],
    to = Table.FromRecords(gr)
in
    to
 
Уважаемые форумчане, помогите в решении задачи через PQ.
Сама недавно начала осваивать PQ и решения пока найти не могу.

Задача:  Есть несколько продуктов (пусть для примера будет всего 2), известны их остатки и уходимость в день. Нужно рассчитать по продукту остаток на начало каждого дня, найти дату дефицита (дата когда остаток < уходимости в день)  и в этот день разместить заказ в количестве кратно 10 коробкам.
ПродуктДатаОстаток, кор.Уходимость в день, кор.
Молоко01.06.2022124
Сметана01.06.2022102
В результате мне нужно получить чтото похожее на такую таблицу.
ПродуктДеньОстаток на началоУходимостьОстаток на конецРазместить заказ
Молоко01.06.20221248
Молоко02.06.2022844
Молоко03.06.202244010
Молоко04.06.20221046
Молоко05.06.202264210
Молоко06.06.20221248
Молоко07.06.2022844
Молоко08.06.202244010
Не понимаю как связать стоки , чтобы остаток на начало 02.06.2022 был равен равен остатку на конец 01.06.2022 + разместить заказ 01.06.2022.
Прошу ПОМОЩИ!
Изменено: Ирина Григорьева - 17.06.2022 13:10:01
 
Ирина Григорьева, какое отношение к теме имеет Ваш вопрос? Создайте отдельную тему.
P.S. Смотрите в сторону List.Generate.
 
Цитата
написал:
Ирина Григорьева, какое отношение к теме имеет Ваш вопрос? Создайте отдельную тему.
P.S. Смотрите в сторону List.Generate.
простите
Страницы: 1
Наверх