Я создаю базу данных MariaDB, которая ежедневно анализирует набор продуктов и цен. Сценарий Python проходит через API, получает все новые продукты и добавляет их в таблицу продуктов, а затем сканирует все цены и сохраняет в таблицу цен с кодом продукта и отметкой времени.
Я пытаюсь добавитьпроцентные отличия от таблицы продуктов за последние 7, 30 и 60 дней с использованием SQL, поскольку я считаю, что это будет быстрее, чем итерация с использованием Python.
Вот пик на таблице продуктов:
+-----------+-----------------------------------------------+------------+
| prod_code | prod_name | date_added |
+-----------+-----------------------------------------------+------------+
| 22207 | Casa Burmester Reserva D.O.C. Douro Branco | 2019-10-20 |
| 16879 | Durbanville Hills First Fill New Oak | 2019-10-20 |
| 22141 | Miguel Torres Gran Reserva Cabernet Sauvignon | 2019-10-20 |
| 18028 | Chateau Langlet A.O.C. Graves Blanc | 2019-10-20 |
| 16774 | Teorema D.O. Calatayud Garnacha | 2019-10-20 |
+-----------+-----------------------------------------------+------------+
И это таблица цен для prod_code = '22141'
:
+-------+-----------+-------+---------------------+
| id | prod_code | price | timestamp |
+-------+-----------+-------+---------------------+
| 10636 | 22141 | 60.71 | 2019-10-29 09:07:38 |
| 9798 | 22141 | 60.71 | 2019-10-28 09:07:58 |
| 8961 | 22141 | 62.05 | 2019-10-27 09:07:18 |
| 8111 | 22141 | 62.05 | 2019-10-26 09:08:10 |
| 7253 | 22141 | 62.05 | 2019-10-25 09:07:22 |
| 6436 | 22141 | 62.05 | 2019-10-24 09:09:18 |
| 5597 | 22141 | 62.05 | 2019-10-23 09:08:53 |
| 4410 | 22141 | 74.06 | 2019-10-21 09:09:03 |
| 3561 | 22141 | 89.93 | 2019-10-20 00:09:15 |
+-------+-----------+-------+---------------------+
Моя цель - получить минимальную цену за последние 7 дней, деленную на режим последних 7 дней. Я смог сделать это с помощью этого запроса, который я построил:
SELECT ROUND(
SUM((
(SELECT MIN(price) AS divisor
FROM prices WHERE prod_code ='22141'
AND timestamp >= CURRENT_DATE - INTERVAL 7 DAY
ORDER BY price DESC) /
(SELECT price FROM prices WHERE prod_code ='22141'
AND timestamp >= CURRENT_DATE - INTERVAL 7 DAY
GROUP BY price
ORDER BY COUNT(*) DESC LIMIT 1))
* 100),2) AS percentage
В этом примере он дает мне 97.84
, который говорит мне, что в последние 7 дней был день, когда цена была97,84% от цены режима.
Хорошая сторона в том, что у меня есть запрос для меня. Теперь возникает вопрос: я хотел бы добавить новый столбец в таблицу продуктов с именем 7_days_mode, и я бы сделал этот расчет для каждого кода продукта. Есть ли способ сделать это в MariaDB, «программируемым» или автоматическим способом SQL, когда приходят новые значения цены, или мне лучше выкинуть другой скрипт Python и пройти через все это, как только мой скрипт получит данные изAPI готов?
(я также принимаю предложения по ускорению расчетов, если таковые имеются).