Анализ изменений цен на продукты на MariaDB и сохранение различий в таблице продуктов - PullRequest
0 голосов
/ 30 октября 2019

Я создаю базу данных 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 готов?

(я также принимаю предложения по ускорению расчетов, если таковые имеются).

1 Ответ

1 голос
/ 30 октября 2019

Вы можете создать VIEW поверх таблицы products, включая вычисление для 7_day_mode:

CREATE VIEW products_mode AS
SELECT *,
       ROUND((SELECT price
              FROM prices 
              WHERE prod_code = products.prod_code
                AND timestamp >= CURRENT_DATE - INTERVAL 7 DAY
              GROUP BY price
              ORDER BY COUNT(*) DESC LIMIT 1), 2) AS 7_day_mode
FROM products

Тогда вы можете просто

SELECT *
FROM products_mode

Демо на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...