如何获取近30天内整体降价的商品?MySQL查询需求
查询近30天内整体价格降低的商品
要实现这个需求,核心是对比每个商品(SKU)在近30天内的初始价格(最早一次价格变更前的价格)和最终价格(最近一次价格变更后的价格),筛选出最终价格低于初始价格的SKU。
方法1:使用窗口函数(MySQL 8.0+)
窗口函数可以更简洁地定位每个SKU的首尾价格记录:
WITH sku_price_trend AS ( SELECT SKU, oldSelling, newSelling, date, ROW_NUMBER() OVER (PARTITION BY SKU ORDER BY date ASC) AS rn_asc, ROW_NUMBER() OVER (PARTITION BY SKU ORDER BY date DESC) AS rn_desc FROM pricechangelog WHERE date >= DATE_SUB(NOW(), INTERVAL 30 DAY) ) SELECT s1.SKU, s1.oldSelling AS initial_price, s2.newSelling AS final_price FROM sku_price_trend s1 JOIN sku_price_trend s2 ON s1.SKU = s2.SKU WHERE s1.rn_asc = 1 AND s2.rn_desc = 1 AND s2.newSelling < s1.oldSelling;
方法2:使用聚合函数(兼容MySQL 5.7及更早版本)
如果你的MySQL版本不支持窗口函数,可以通过聚合函数获取每个SKU的最早/最晚日期,再关联原表提取对应价格:
SELECT p_initial.SKU, p_initial.oldSelling AS initial_price, p_final.newSelling AS final_price FROM (SELECT SKU, MIN(date) AS min_date FROM pricechangelog WHERE date >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY SKU) AS sku_min JOIN pricechangelog p_initial ON sku_min.SKU = p_initial.SKU AND sku_min.min_date = p_initial.date JOIN (SELECT SKU, MAX(date) AS max_date FROM pricechangelog WHERE date >= DATE_SUB(NOW(), INTERVAL 30 DAY) GROUP BY SKU) AS sku_max ON sku_min.SKU = sku_max.SKU JOIN pricechangelog p_final ON sku_max.SKU = p_final.SKU AND sku_max.max_date = p_final.date WHERE p_final.newSelling < p_initial.oldSelling;
关键说明
- 近30天范围调整:
DATE_SUB(NOW(), INTERVAL 30 DAY)包含当前时间往前推30天内的所有记录;若需按自然日统计(如最近30个日历天),可替换为CURDATE() - INTERVAL 30 DAY。 - 单条变更记录处理:如果某个SKU在近30天内只有一次价格变更,只要本次变更的
newSelling < oldSelling,就会被判定为价格降低。 - 趋势判定逻辑:无论中间价格有多少次涨跌,只要最终价格低于初始价格,该SKU就会被纳入结果集。
内容的提问来源于stack exchange,提问作者Malumbo
相关产品推荐
相关产品推荐

