【问题标题】:How to get the last record from Ms Access table如何从 Ms Access 表中获取最后一条记录
【发布时间】:2026-02-13 10:55:01
【问题描述】:

我有 2 个名为 ReefersAlerts 的表。我想加入这两个表。

现在,如何从 Alerts 表中获得显示每个 ReeferNo 的最后一条记录的结果,其中 AlertType 等于 “温度”

TABLE 1: Reefers                            
ReeferNo    Transporter                     
E-110       Express1                        
E-111       Express1                        
E-112       Express1                        
A-001       A-Trucking                      
A-002       A-Trucking                      

TABLE 2: Alerts                         
AlertDateTime   ReceivedDateTime    AlertType   ReeferNo    Temperature Location        
5/2/15 9:53 AM  5/2/15 9:58 AM     Arrival       E-110        5.2      Warehouse        
5/2/15 9:48 AM  5/2/15 9:53 AM     Departure     E-111        5.4      Warehouse        
5/2/15 9:40 AM  5/2/15 9:45 AM     Temperatures  A-001        11.37    Warehouse        
5/2/15 9:38 AM  5/2/15 9:43 AM     Temperatures  A-001        10.06    Store        
5/2/15 9:35 AM  5/2/15 9:40 AM     Temperatures  A-001        10.02    Store        
5/2/15 9:19 AM  5/2/15 9:24 AM     Departure     A-001        10.02    Store        
5/2/15 9:12 AM  5/2/15 9:17 AM     Temperatures  A-002        10.37    Warehouse        
5/2/15 9:06 AM  5/2/15 9:11 AM     Temperatures  A-002        12.62    Warehouse        
5/2/15 9:04 AM  5/2/15 9:09 AM     Arrival       A-002        12.62    Warehouse        

结果必须是:

ReeferNo  Transporter   AlertDateTime   ReceivedDateTime    AlertType   Temperature Location
E-110     Express1
E-111     Express1
E-112     Express1
A-001     A-Trucking   5/2/15 9:40 AM   5/2/15 9:45 AM    Temperatures     11.37       Warehouse
A-002     A-Trucking   5/2/15 9:12 AM   5/2/15 9:17 AM    Temperatures     10.37       Warehouse

我正在使用下面的代码,但它没有给我想要的结果。

SELECT Reefers.ReeferNo, Reefers.Transporter, Alerts.AlertType,     
Alerts.AlertDateTime, Alerts.Temperature, Alerts.Location, 
Alerts.ReceivedDateTime
FROM Reefers INNER JOIN (Alerts INNER JOIN (SELECT 
Alerts.ReeferNo, 
MAX(Alerts.ReceivedDateTime) 
AS MaxReceivedDateTime 
FROM Alerts 
GROUP BY Alerts.ReeferNo)  AS temptable ON (Alerts.ReeferNo =     
temptable.ReeferNo) AND (Alerts.ReceivedDateTime = 
temptable.MaxReceivedDateTime)) ON Reefers.ReeferNo = Alerts.ReeferNo
WHERE (((Alerts.AlertType)="Temperatures"));

更新:

我更改了所需的结果。对于没有温度 AlertTypeReefers,请将其留空,而不是 Null。

【问题讨论】:

  • 如何缩小E-110 / E-111 的范围?比如,如果有 10 条不同的记录,但它们都没有 Temperatures.. 是否有 10 条 NULL 记录?
  • E-110 和 E-110 是冷藏箱编号 (ID)。这两个 Reefers 没有温度警报,这就是为什么它显示结果为 Null 或让我们说空白。

标签: sql ms-access join max


【解决方案1】:

从一个查询开始,它会为那些至少有一个温度警报的 Reefers 提取你想要的一切:

SELECT
    sub1.ReeferNo,
    a2.AlertDateTime,
    a2.ReceivedDateTime,
    a2.AlertType,
    a2.Temperature,
    a2.Location
FROM
    (
        SELECT
            a1.ReeferNo,
            Max(a1.AlertDateTime) AS MaxOfAlertDateTime
        FROM Alerts AS a1
        WHERE a1.AlertType='Temperatures'
        GROUP BY a1.ReeferNo
    ) AS sub1
    INNER JOIN Alerts AS a2
    ON
            (sub1.MaxOfAlertDateTime = a2.AlertDateTime)
        AND (sub1.ReeferNo = a2.ReeferNo);

然后LEFT JOIN Reefers 表到基于第一个查询的子查询...

SELECT
    r.ReeferNo,
    r.Transporter,
    sub2.AlertDateTime,
    sub2.ReceivedDateTime,
    sub2.AlertType,
    sub2.Temperature,
    sub2.Location
FROM
    Reefers AS r
    LEFT JOIN
    (
        SELECT
            sub1.ReeferNo,
            a2.AlertDateTime,
            a2.ReceivedDateTime,
            a2.AlertType,
            a2.Temperature,
            a2.Location
        FROM
            (
                SELECT
                    a1.ReeferNo,
                    Max(a1.AlertDateTime) AS MaxOfAlertDateTime
                FROM Alerts AS a1
                WHERE a1.AlertType='Temperatures'
                GROUP BY a1.ReeferNo
            ) AS sub1
            INNER JOIN Alerts AS a2
            ON
                    (sub1.MaxOfAlertDateTime = a2.AlertDateTime)
                AND (sub1.ReeferNo = a2.ReeferNo)
        ) AS sub2
    ON r.ReeferNo = sub2.ReeferNo;

【讨论】: