You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取近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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:50:49