Страницы: 1
RSS
Задачи в Power query: выбор значения по дате из периода
 
Доброго времени суток!
Уважаемые форумчани! Это мой первый пост на форумt, не судите строго.
Помогите в решении одной небольшой задачи в Power Query.
первое, есть справочная таблица с указанием сделки (идентификатора сделки) и периоды (начальная и конечная дата) действия процентной ставки по сделке.
втрое, есть таблица с данными  "Сделки"  и "Дата"
Необходимо, вытащить действующий процент на дату который попадает в период.  
Изменено: Shuhrat - 18.01.2023 08:26:21
 
Shuhrat, Думаю, что интервальный поиск тут будет самым быстрым вариантом. Поищите на форуме, мне лень в 100 раз делать :)
Только справочник нужно будет переделать немного в PQ.
Вот такой вариант попробуйте:
Код
let
  sprData = Excel.CurrentWorkbook(){[ Name = "Сравочник" ]}[Content],
  spr = Table.Buffer ( Table.TransformColumnTypes ( sprData, { { "НачалДата", type date }, { "КонечДата", type date } } ) ),
  lst = List.Buffer ( spr[Процент] ),
  data = Excel.CurrentWorkbook(){[ Name = "Сделки" ]}[Content],
  typed = Table.TransformColumnTypes ( data, { { "Сумма", type number }, { "Дата", type date } } ),
  addPerc = Table.AddColumn (
    typed,
    "Процент",
    ( r ) =>
      try
        lst{Table.PositionOf ( spr, r, Occurrence.First, ( x, y ) => y[Дата] >= x[НачалДата] and y[Дата] <= x[КонечДата] and x[Сделка] = y[Сделка] )}
      otherwise
        null,
    type number
  )
in
  addPerc
 
surkenny, Спасибо! Будем искать )))
 
В продолжении темы.

С одной колонкой с процентами работает норм.
У моей таблицы  ("Сделки"  и "Дата") больше 2 млн.строк (Вариант с создание новой таблицы не очень подходить)
а "справочник" содержит более 400 строк и проценты даны в 4 колонках.

Как быть ?
 
Shuhrat, я за интервальный поиск.
Если не получается самостоятельно, то попросите модераторов перенести тему в раздел работа.
Смогу взяться за реализацию.
По цене написал в ЛС.
 
Мое решение выкладывать или нет?)
 
Цитата
написал:
Мое решение выкладывать или нет?)
Конечно.  
 
Наипростейший подход.
Shuhrat, напишите сколько по времени работает запрос на 2млн строк. Или ссылку на файл
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Сравочник"]}[Content],
    #"Added Custom" = Table.AddColumn(Source, "a", each {Number.From([НачалДата])..Number.From([КонечДата])}),
    b = Table.ExpandListColumn(#"Added Custom", "a"),
    Custom1 = Excel.CurrentWorkbook(){[ Name = "Сделки" ]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Custom1,{{"Дата", Int64.Type}}),
    #"Merged Queries" = Table.NestedJoin(#"Changed Type", {"Сделка", "Дата"}, b, {"Сделка", "a"}, "Changed Type", JoinKind.LeftOuter),
    #"Expanded {0}" = Table.ExpandTableColumn(#"Merged Queries", "Changed Type", {"Процент1", "Процент2", "Процент3", "Процент4"}, {"Процент1", "Процент2", "Процент3", "Процент4"})
in
    #"Expanded {0}"
 
Цитата
написал:
Shuhrat , напишите сколько по времени работает запрос на 2млн строк. Или ссылку на файл
Как только с интегрирую напишу. Спасибо.
 
[QUOTE]Михаил Л написал:
не шустро :)
из 11 строк справочника получается 1875 строк по всем датам.
Тут и вариант из #2 можно переделать.
Но самым шустрым будет интервальный поиск :)

Shuhrat, даже если возьмете решение Михаил Л, если не сложно, дайте мне в ЛС (или в tg) реальные данные (я их использовать и распространять не буду :) ) - я покажу сравнительное время вычисления результатов по разным методам.
 
Цитата
surkenny написал:
их использовать и распространять не буду
Давайте наоборот скините эти данные в тему, предварительно изменив конф-данные)
Скорость не будет ниже чем в два раза.
Изменено: Михаил Л - 20.01.2023 13:44:19
 
Михаил Л, кстати, важный момент Вы не учли:
что произойдет, если вдруг в справочнике будут пересекающиеся даты для одной сделки? :)
К примеру, как на рисунке:

Никогда нельзя исключать ошибки пользователей :)
 
Цитата
Михаил Л написал:
Скорость не будет ниже чем в два раза.
Уверены? :) Что готовы поставить?
На больших объемах (типа справочник (уже разделенный на строки) 1kk, данные 1kkk+) Ваш запрос далеко не на каждой машинке вообще когда-либо выполнится :)
Изменено: surkenny - 20.01.2023 13:55:30
 
Цитата
surkenny написал:
Никогда нельзя исключать ошибки пользователей
Не мне же их исключать.
зы. Насчет остального нужны данные для проверки
Изменено: Михаил Л - 20.01.2023 14:02:45
 
Цитата
surkenny написал:
что произойдет, если вдруг в справочнике будут пересекающиеся даты для одной сделки?
Михаил Л, а на это ответить? :)
Более того, в данных такого может не быть. Но предполагать всегда нужно.

P.S. Я не критикую Ваше решение :) И не прошу делать все за ТС (тем более бесплатно). Этот комментарий исключительно для Вас и Вашего развития :)
 
Цитата
surkenny написал:
что произойдет, если вдруг в справочнике будут пересекающиеся даты для одной сделки?
В изначальных данных этого нет.  Если бы были пересекающие даты, то рано вообще что-либо решать. Сначала надо определить какие данные показывать, с первой строки, со второй или с обеих строк данные.
Цитата
surkenny написал:
исключительно для Вас и Вашего развития
Мне уже за сорок. Куда развиваться) Завязывать уже пора, это да)
Мой запрос на миллионе строк и 400+ строк отработал за 20сек. Пример весил более 8мб, да и на работе уже остался
ps/ Вот пример по быстрому на млн строк и справочнике 400строк. Сначала обновить запрос Сделки, а потом result
Изменено: Михаил Л - 21.01.2023 08:23:21 (Заменил пример)
 
Уважаемые форумчане!
Я рад что моя задача вызвала столько дискуссий. Решение Михаила на примере сработала на ура. Но на реальных данных я ещё не с интегрировал. Так как помимо этого там ещё куча вычислений, типа "тут считай, а тута нет". В примере я сильно упростил задачу (выделил только один шаг). Как только все сделаю обязательно сообщу результат.
отвечая на возникшие вопросы: общий объем данный 120 м. точное кол-во строк: 2 003 384, "нахлёста"  дат не может быть, за это отвечает другая программа.
Компьютер: Intel® Core™ i5-9500 CPU @ 3.00GHz   3.00 GHz RAM 8 gB
Без указанного функционала вычисляется примерно 3 минуты (точно не засекал).


Моя работа не связана с вычислениями - это хобби. Помогаю коллегам с вычислениями. Немного о себе Power Query я занимаюсь всего месяц. Но на Excel работаю аж с версии виндовса win3.1 (до него работал на Quattro Pro под DOS, а до него SuperCalc если помните такие :D ).  
 
Цитата
Михаил Л написал:
(Заменил пример)
На этом примере на рабочем компе за 10сек.
Дома за 30сек
 
С интегрировал, отработала за 3:30 сек. Думаю, что решение приемлемо.
Изменено: Shuhrat - 23.01.2023 13:02:38
 
surkenny , Михаил Л Спасибо за помощь!
Страницы: 1
Наверх