Анализ притока и оттока деталей - PullRequest
0 голосов
/ 12 апреля 2019

Нам необходимо проанализировать потребление детали.Данные, которые у меня есть, взяты из нашей системы ERP.Идея состоит в том, чтобы найти «дыры» там, где в будущем слишком много запасов.

Part_number Sign Count Date
4711        B    100   12.04.2019
4711        -    2     16.04.2019
4711        -    1     18.04.2019
4711        -    3     01.05.2019
4711        -    5     14.05.2019
4711        -    1     18.05.2019
4711        +    25    23.05.2019
4711        -    7     24.05.2019
4711        -    1     01.06.2019
4711        -    1     14.06.2019
4711        -    6     15.06.2019
4711        +    15    23.07.2019
4711        -    7     24.07.2019
4711        -    3     01.08.2019
4711        -    25    14.08.2019
4711        -    6     15.08.2019
4712        B    10    12.04.2019
4712        -    2     13.04.2019
4712        -    3     14.04.2019
4713        …    …     …

Описания колонок:

  • Part_number => Самоочевидно, наверное,
  • Знак
    • Текущий запас "B",
    • "-" Деталь, использованная для создания заказа,
    • "+" Заказанные новые детали и планируемая дата прибытия
  • Количество => Сумма
  • Дата => Запланированная дата в будущем

Моя идея состоит в том, чтобы разделить данные по разделам.Секции начинаются всякий раз, когда происходит положительное изменение в запасе, например поступающий заказ, и заканчиваются следующим положительным изменением в запасе.Первый и последний раздел являются исключением.Первый раздел начинается с сегодняшней даты и заканчивается следующим положительным изменением.Последний раздел начинается с последнего положительного изменения и заканчивается последней строкой данных.

Я ожидаю, что таблица разделов на основе приведенных выше данных будет выглядеть следующим образом.

Part_number Section Date_start  Date_end
4711        1       12.04.2019  23.05.2019
4711        2       23.05.2019  23.07.2019
4711        3       23.07.2019  15.08.2019
4712        1       12.04.2019  14.04.2019

Чтобы найти «дыры», необходимо подсчитать столбец подсчета, что приводит к следующей таблице

Part_number Section Date_start  Date_end   Sum
4711        1       12.04.2019  23.05.2019 88   <= 100-2-1-3-5-1
4711        2       23.05.2019  23.07.2019 98   <= 88+25-7-1-1-6
4711        3       23.07.2019  15.08.2019 72   <= 98+15-7-3-25-6
4712        1       12.04.2019  14.04.2019 5    <= 10-2-3

Наш сервер баз данных - Microsoft Sql Server 2016.

В настоящее время я используюконструкция курсора для массажа данных и получения того, что я хочу.Как вы можете себе представить, это, вероятно, не лучший подход.Я хотел бы улучшить этот запрос, и я с нетерпением жду любых подсказок, которые смогу получить.

Спасибо!

1 Ответ

0 голосов
/ 12 апреля 2019

Если я правильно понимаю, вы можете использовать агрегацию и оконные функции. Ключом является определение раздела, который представляет собой совокупное число знаков B и + для каждой строки:

select part_number, section,
       min(date), max(date),
       sum(case when sign = '-' then -count else count end) as section_count,
       sum(sum(case when sign = '-' then -count else count end)) over (partition by part_number order by section) as sum
from (select t.*,
             sum(case when sign in ('B', '+') then 1 else 0 end) over (partition by part_number order by date) as section
      from t
     ) t
group by part_number, section;
...