сложные подзапросы в MySQL с использованием FIFO Dynamic CTE - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 3 таблицы:

Первая таблица: (Покупка)

date (mm-dd)    quantity   p_id
    05-05          3         1
    05-06          2         1

Вторая таблица: (Продажи)

date (mm-dd)    quantity   p_id
    05-07          1         1

Третья таблица: (Истекло)

date (mm-dd)    quantity   p_id
    05-08          4         1

Теперь, что я хочуэто получить информацию о продуктах, срок действия которых истек:

  • Когда продукт, срок действия которого истек, был приобретен (FIFO)
  • Продукт, который был приобретен первым, истекает / продаётся первым.

Выход должен быть:

purchase_date      expired_date      quantity    p_id
  05-05               05-08             2         1
  05-06               05-08             2         1

Пояснение,

  • В магазине есть 5 товаров по05-06 с p_id: 1,
  • , затем на 05-07 1 количество было продано p_id: 1 т.е. продукт, который был получен на 05-05, был сначала продан какза FIFO

так что теперь у нас есть продукт: (только для визуализации)

date (mm-dd)    quantity   p_id
    05-05          2         1   -its 1 quantity is sold
    05-06          2         1

Тогда истечение срока действия 05-08, просроченные продукты: ( по FIFO )

purchase_date      expired_date      quantity   p_id
  05-05               05-08             2         1
  05-06               05-08             2         1

т.е. 2 продукты05-05 истек срок действия и 2 из 05-06

К настоящему времени я использую логику:

Все добавленные транзакции:

date (mm-dd)    quantity   p_id    expired
    05-05          3         1      False
    05-06          2         1      False
    05-07         -1         1      False
    05-08         -4         1      True

Добавить все транзакции как: (как показано выше)
Установить количество sell и expiry как отрицательное и переменную expired,True только если его транзакция истечения

Алгоритм: (используя концепцию deque push pop, когда истекает, зарегистрируйте его)

  1. для каждой группы p_id транзакции:
  2. инициализация deque (пусто)
  3. для каждой транзакции (все добавленные транзакции)
  4. , если количество положительное, нажмите кнопку deque
  5. else pop,
  6. , если всплывающее окно не пропущено (поскольку продажа может быть больше, чем покупка)
  7. else, если expired имеет значение false, то есть транзакции на продажу,
  8. выдавать до разницыof sell and pop больше, чем равно нулю
  9. , в противном случае это пустая запись
  10. pop, пока разница не станет больше нуля, также регистрируйте каждое pop up с разницей

* Я останавливаюсь, если разница больше нуля или равна нулю, означает, что было куплено больше количества, чем продано, поскольку проданное количество отрицательно, рассмотрим:

bought = 2
sold = -4
diff = 2-4 = -2
therefore we need to loop for next purchase until diff >= 0

Фактически в настоящее времякак я делаю все это - загружаю все эти данные из моего RDBMS в панды dataframe и затем применяю некоторые вещи, очевидно, что это невозможно обслуживать, я хочу сделать это в самой базе данных, так как база данных оптимизирована, я хочусделать комплекс MySQL query, который делает sub-queries, чтобы получить желаемый результат.

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

В основном, что происходит:

  • Продукт покупки в магазине,Запись о покупке сделана,
  • Магазин продает товар, запись о продаже сделана,
  • Магазин сообщает, что срок действия этого продукта истек, запись об истечении срока действия

*Между ними нет никаких отношений.

Также я использую Django Querysets, чтобы получить данные, поэтому, если бы я мог их использовать, это было бы очень полезно!

Также я готов вносить изменения или использовать совершенно другой инструмент для достижения таких целей.

...