У меня есть 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, когда истекает, зарегистрируйте его)
- для каждой группы
p_id
транзакции: - инициализация
deque
(пусто) - для каждой транзакции (все добавленные транзакции)
- , если количество положительное, нажмите кнопку deque
- else pop,
- , если всплывающее окно не пропущено (поскольку продажа может быть больше, чем покупка)
- else, если expired имеет значение false, то есть транзакции на продажу,
- выдавать до разницыof sell and pop больше, чем равно нулю
- , в противном случае это пустая запись
- 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
, чтобы получить данные, поэтому, если бы я мог их использовать, это было бы очень полезно!
Также я готов вносить изменения или использовать совершенно другой инструмент для достижения таких целей.