MySQL日期范围Max/Min子查询:获取首尾日期对应库存数据
调整后的SQL查询方案
我帮你把需求整合到查询里了,核心是用关联子查询来获取每组(按周、ASIN、SKU等分组)最早和最新日期对应的库存数据,同时保留你原来需要的所有字段。
完整查询示例
SELECT -- 保留原有的周起始日期计算逻辑 (t.Date + INTERVAL -(WEEKDAY(t.Date)) DAY) AS week_start_date, -- 原有维度与聚合字段 MAX(t.Date) AS latest_date, MIN(t.Date) AS earliest_date, t.ASIN, t.ItemSKU, it.avgInv, kt.Account, kt.Country, SUM(t.Sessions) AS Sessions, AVG(t.Session_Pct) AS Session_Pct, SUM(t.Page_Views) AS Page_Views, AVG(t.Page_Views_Pct) AS Page_Views_Pct, AVG(t.Buy_Box_Pct) AS Buy_Box_Pct, SUM(t.Units_Sold) AS Units_Sold, -- 补全你未写完的字段,可根据实际调整 -- 子查询获取分组内最早日期的库存数据 ( SELECT sellable FROM clabDevelopment.fba_history_daily fh_min WHERE fh_min.Date = MIN(t.Date) AND fh_min.ASIN = t.ASIN AND fh_min.ItemSKU = t.ItemSKU ) AS earliest_sellable, -- 子查询获取分组内最新日期的库存数据 ( SELECT sellable FROM clabDevelopment.fba_history_daily fh_max WHERE fh_max.Date = MAX(t.Date) AND fh_max.ASIN = t.ASIN AND fh_max.ItemSKU = t.ItemSKU ) AS latest_sellable FROM -- 这里假设你的主业务表是t,关联it和kt表(请替换成实际表名与关联条件) your_main_table t JOIN clabDevelopment.inventory_table it ON t.ItemSKU = it.ItemSKU JOIN clabDevelopment.account_table kt ON t.Account = kt.Account GROUP BY -- 所有非聚合维度字段必须加入分组,避免语法错误 week_start_date, t.ASIN, t.ItemSKU, it.avgInv, kt.Account, kt.Country;
关键细节说明
- 关联子查询的作用:直接在
WHERE里用MAX(Date)会触发语法错误(聚合函数不能直接用于WHERE子句),通过关联ASIN和ItemSKU,能确保子查询拿到的是当前分组内最早/最新日期对应的库存,而不是全局的极值数据。 - 分组规则注意:所有出现在SELECT中的非聚合字段(比如ASIN、Account等)必须放到GROUP BY中,严格SQL模式下这是强制要求,避免数据逻辑混乱。
- 字段灵活调整:我补全了
Units_Sold字段,你可以根据实际业务需求,继续添加或修改其他未写完的字段。
内容的提问来源于stack exchange,提问作者user8022517
相关产品推荐
相关产品推荐

