Я использую приведенный ниже 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