MySQL, выберите, чтобы включить более ранние недели - PullRequest
1 голос
/ 10 июня 2019

Я использую приведенный ниже SQL для получения истории цен за неделю из двух таблиц базы данных MySQL:

SELECT ROUND(MIN(ph.price), 0) AS min_price, WEEK(ph.added) AS added
FROM products_data pd JOIN products_history ph ON pd.id = ph.product_id
WHERE ph.price > 0
GROUP BY added
ORDER BY added

Все хорошо, за исключением того, что таблица products_history содержит записи только при изменении цены.

Если на неделе A происходит изменение цены, которое создает самое низкое значение min_price на неделе A, все хорошо.

Но если изменение цены произошло за 1 + недели до недели A, этоследовательно, не обнаруживается запросом, и полученное наименьшее значение min_price для недели A может быть неправильным: (

Пример того, что происходит сейчас:

Week 13: Price change so min_price for product A = 4.78,
query returns 4.78 (correct)

Week 14: Price change so min_price for product B = 4.74,
query returns 4.74 (correct)

Week 15: Price change so min_price for product C = 4.79,
query returns 4.79 (wrong, should be 4.74 since that's still the price for product B)

Week 16: Price change so min_price for product C = 4.75,
query returns 4.75 (wrong, should be 4.74 since that's still the price for product B)

Week 17: No price changes,
query returns nothing...  (wrong, should be 4.74 since that's still the price for product B)

Week 18: Price change so min_price for product B = 4.77,
query returns 4.77 (wrong, should be 4.75 since that's still the price for product C)

Любые идеи о том, как сделатьзапрос извлекает минимальную минимальную цену за неделю, даже если изменение произошло раньше?


products_data имеет следующие столбцы:

id, name, category
2434, 'Product A', 'Bits'
3437, 'Product B', 'Bits'

products_history имеет следующие столбцы:

id, product_id, price, added
4311, 2434, 4.74, 2019-05-15 22:19:50
2434, 3437, 4.78, 2019-05-15 22:19:59

Рабочая версия, основанная на правильном ответе Гордона Линоффа ниже:

SELECT id, yw.yyyyww,
       (SELECT ph2.price
        FROM products_history ph2
        WHERE ph2.price > 0 AND
              YEARWEEK(ph2.added) <= yw.yyyyww AND ph2.product_id = pd.id
        ORDER BY YEARWEEK(ph2.added) DESC,  -- put the most recent values first
                 ph2.price ASC  -- by lowest price
        LIMIT 1
       ) AS min_price
FROM products_data pd CROSS JOIN
     (SELECT DISTINCT YEARWEEK(ph.added) AS yyyyww
      FROM products_history ph
     ) yw

1 Ответ

0 голосов
/ 10 июня 2019

Если я правильно понимаю, вам нужно значение для каждого продукта за каждую неделю.Если это так, используйте cross join для генерации строк, а затем - в MySQL - вы можете использовать коррелированный подзапрос, чтобы получить цену

SELECT product_id, yw.yyyyww,
       (SELECT ph2.price
        FROM products_history ph2
        WHERE ph2.price > 0 AND
              YEARWEEK(ph2.added) <= yw.yyyyww
        ORDER BY YEARWEEK(ph2.added) DESC,  -- put the most recent values first
                 ph2.price ASC  -- by lowest price
       ) as min_price
FROM products_data pd CROSS JOIN
     (SELECT DISTINCT YEARWEEK(ph.added) as yyyyww
      FROM products_history ph
     ) yw
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...