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

在MS Access中为产品添加上次发货日期列的高效实现方法

解决MS Access中获取产品上次发货日期的高效方法

问题分析

你需要为每个产品的每条发货记录,匹配该产品比当前发货日期更早的最近一次发货日期,同时过滤掉没有历史发货记录的条目(如单个发货记录的产品、产品的最早发货记录)。

你的查询问题说明

  1. 第一个自连接查询未做聚合,会返回当前发货日期之前的所有历史日期,因此产生多余记录;
  2. 第二个MAX查询的HAVING子句使用错误:LastShipped是聚合后的别名,不能在HAVING中直接引用,且日期筛选条件应放在JOIN关联条件中,而非分组后的过滤环节,这导致查询返回0条记录。

高效解决方案

方法1:自连接+聚合查询(推荐)

通过自连接关联同产品的更早发货记录,再通过MAX()聚合获取最近的上次发货日期,同时自动过滤无历史记录的条目:

SELECT 
    t1.Product, 
    t1.ShipDate, 
    MAX(t2.ShipDate) AS LastShipped
FROM 
    table1 AS t1
INNER JOIN 
    table1 AS t2 
    ON t1.Product = t2.Product 
    AND t2.ShipDate < t1.ShipDate
GROUP BY 
    t1.Product, t1.ShipDate

方法2:子查询+EXISTS过滤

通过子查询直接获取当前记录的最近历史发货日期,并用EXISTS过滤掉无历史记录的条目:

SELECT 
    t1.Product, 
    t1.ShipDate,
    (
        SELECT MAX(ShipDate) 
        FROM table1 AS t2 
        WHERE t2.Product = t1.Product AND t2.ShipDate < t1.ShipDate
    ) AS LastShipped
FROM 
    table1 AS t1
WHERE 
    EXISTS (
        SELECT 1 
        FROM table1 AS t2 
        WHERE t2.Product = t1.Product AND t2.ShipDate < t1.ShipDate
    )

性能优化建议

为了让查询更快,建议给表创建复合索引:

CREATE INDEX idx_Product_ShipDate ON table1 (Product, ShipDate);

该索引会大幅加速自连接和子查询中的关联、筛选操作,尤其当表数据量较大时效果明显。

内容的提问来源于stack exchange,提问作者L Kadue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:45:16