【问题标题】:Find the latest record查找最新记录
【发布时间】:2021-11-22 02:32:24
【问题描述】:

在 MS Access 中,我有 DateList 表,其中包含不同订单的到期日期。因此,该表有两列:OrderNo 和 DueDate。对于某些订单号,可能有多个 DueDate。该表可能如下所示:

OrderNo DueDate
100     12/9/2021
101     20/9/2021
102     30/9/2021
100     7/10/2021
102     11/10/2021
103     15/10/2021
…

我的目标是编写一个查询来获取每个 OrderNr 的最新 DueDate。

我创建了两个查询; 第一个,qry1,生成一个没有重复的 OrdNo 列表:

SELECT  
DateList.OrderNo AS UniqOrderNo 
FROM DateList 
GROUPBY DateList.OrderNo;

在第二个查询qry2中,我使用了 DMax 函数来搜索每个订单的 DueDates 中的最大值。

SELECT 
qry1.UniqOrderNo
,DMax("[DueDate]","[DateList]","[OrderNo]='[qry1]![UniqOrderNo]'") AS LatDuDate
FROM qry1 
INNER JOIN DateList 
ON qry1.UniqOrderNo = DateList.OrderNo;

LatDuDate 表示订单的最新 DueDate。

不幸的是,该查询不起作用并且什么也不返回。

现在我的问题:

我的方法/查询有问题吗?

有没有更好的方法在 MS Access 中完成这项任务?

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    你几乎自己想通了。 Max 返回该组中的最大值。

    SELECT Max(DueDate) DueDate, OrderNo
    FROM DateList
    GROUP BY OrderNo
    

    【讨论】:

      【解决方案2】:

      与 Christian 的回答类似,但由于 OrderNo 是唯一 ID,您可以简单地选择 First() 而不是分组 - 它的性能更好。 **

      当然,这取决于表中的记录数。

      SELECT First(OrderNo) AS OrderNo, Max(DueDate) AS DueDate
      FROM DateList;
      

      ** 来源:Allen Browne - Optimizing queries

      【讨论】:

      • First() 在一般使用中是一个非常不可靠的函数。在这种情况下,按预期工作,但并非总是如此。虽然通常我不敢质疑 Allen Browne 的建议 - 我想您会发现当前版本的 Access 数据库引擎处理分组查询比 15-20 年前更有效。
      猜你喜欢
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 2017-01-11
      • 2016-12-09
      • 1970-01-01
      相关资源
      最近更新 更多