У меня есть 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
(пусто) - за каждую транзакцию (все присоединенные транзакции)
- если количество положительное, вставить дек
- иначе поп,
- если нет всплывающего окна, пропустите (так как продажа может быть больше, чем покупка)
- иначе если expired является ложным, т.е. является транзакцией продажи,
- pop до тех пор, пока разница продаж и популярности не станет больше нуля
- в противном случае это ненужная запись
- всплывать до тех пор, пока разница не станет больше нуля, а также регистрировать каждое всплывающее окно с разницей
* Я останавливаюсь, когда разница больше или равна нулю, что означает, что было куплено больше количества, чем продано, поскольку количество проданных товаров отрицательное, рассмотрим:
bought = 2
sold = -4
diff = 2-4 = -2
therefore we need to loop for next purchase until diff >= 0
На самом деле в настоящее время, как я все это делаю, загружаю все эти данные из моего RDBMS
в pandas dataframe
, а затем применяю некоторые вещи, очевидно, это не поддерживается, я хочу сделать это в самой базе данных, поскольку база данных оптимизирована, я хочу сделать сложный MySQL
query
, который делает sub-queries
для получения желаемого результата.
Когда продажа завершена, у меня происходят разные вещи, поэтому я хочу, чтобы в это время была минимальная загрузка.
В основном происходит следующее:
- Магазин покупает товар, делается запись о покупке,
- Магазин продает товар, делается запись о продаже,
- Магазин сообщает, что этот продукт просрочен, делается запись об истечении срока годности.
*Между ними нет отношений.
Также я использую Django Querysets
для получения данных, поэтому, если бы я мог использовать это, это было бы здорово!
Также я открыт для внесения изменений или использования совершенно другого инструмента для их достижения.
ORDER BY
/LIMIT
в рекурсивном CTE. - person danblack   schedule 15.09.2018mysql
пока нет обходного пути! Должен ли я придерживаться своей старой реализацииdeque
? - person Aashish Gahlawat   schedule 19.09.2018