繁体   English   中英

Microsoft Access SQL-选择记录的最新“版本”

[英]Microsoft Access SQL - Select Most Recent “Version” of Record

我正在处理一个选择查询,该查询根据外键EFTRecIDNum选择给定记录的批准者列表。 批准者列表存储在表tblApprover ,带有相关字段EFTRecIDNumApproverApprovalTimeApproverAction 面临的挑战是,我需要给定EFTRecIDNum所有记录,以期望批准者执行相同操作的次数超过一次(确实具有业务目的)。 在这种情况下,我需要选择最新记录。 我的数据如下: +------+-------------+----------+--------------+----------------+ | ID | EFTRecIDNum | Approver | ApprovalTime | ApproverAction | +------+-------------+----------+--------------+----------------+ | 503 | 111 | Person A | 09-Jun-16 | Reviewed | | 865 | 111 | Person B | 10-Jun-16 | Reviewed | | 1517 | 111 | Person C | 11-Jun-16 | Reviewed | | 1610 | 111 | Person C | 12-Jun-16 | Reviewed | | 1743 | 111 | Person D | 13-Jun-16 | Approved | | 1744 | 111 | Person C | 14-Jun-16 | Approved | +------+-------------+----------+--------------+----------------+ +------+-------------+----------+--------------+----------------+ | ID | EFTRecIDNum | Approver | ApprovalTime | ApproverAction | +------+-------------+----------+--------------+----------------+ | 503 | 111 | Person A | 09-Jun-16 | Reviewed | | 865 | 111 | Person B | 10-Jun-16 | Reviewed | | 1517 | 111 | Person C | 11-Jun-16 | Reviewed | | 1610 | 111 | Person C | 12-Jun-16 | Reviewed | | 1743 | 111 | Person D | 13-Jun-16 | Approved | | 1744 | 111 | Person C | 14-Jun-16 | Approved | +------+-------------+----------+--------------+----------------+ +------+-------------+----------+--------------+----------------+ | ID | EFTRecIDNum | Approver | ApprovalTime | ApproverAction | +------+-------------+----------+--------------+----------------+ | 503 | 111 | Person A | 09-Jun-16 | Reviewed | | 865 | 111 | Person B | 10-Jun-16 | Reviewed | | 1517 | 111 | Person C | 11-Jun-16 | Reviewed | | 1610 | 111 | Person C | 12-Jun-16 | Reviewed | | 1743 | 111 | Person D | 13-Jun-16 | Approved | | 1744 | 111 | Person C | 14-Jun-16 | Approved | +------+-------------+----------+--------------+----------------+我需要选择除ID号1517以外的所有内容。

我已经尝试了一些不同的操作来进行联接和子选择,但是最终总是只能选择最新的审阅者/批准者。

SELECT
    a.EFTRecIDNum,
    a.Approver, 
    a.ApprovalTime, 
    a.ApproverAction
FROM tblApprover a INNER JOIN 
      (SELECT ApproverAction, MAX(ApprovalTime) as sTime
      FROM tblApprover GROUP BY ApproverAction) b 
on a.ApproverAction=b.ApproverAction and a.ApprovalTime = b.sTime

请让我知道我是否可以添加或澄清。

编辑:添加了另一行数据来澄清。

在我看来,您的加入不完整,您需要其他字段...

首先,我们为ApproverAction,approver和EFTRecIDNum(B)生成具有最高ID的一组记录。 然后,我们将该基本集加入到相关字段的整个集合(A)中。 如果时间可以相同,则我们不能将时间用作最大密钥,因为这将导致结果重复,并且必须使用ID。 如果我们可以假设您想要最大ID(现在我假设ID是唯一的)

SELECT
    a.EFTRecIDNum,
    a.Approver, 
    a.ApprovalTime, 
    a.ApproverAction
FROM tblApprover a 
INNER JOIN (SELECT ApproverAction, MAX(ApprovalTime) as sTime, Approver, EFTRecIDNum
            FROM tblApprover 
            GROUP BY ApproverAction, Approver, EFTRecIDNum) b 
 on a.ApproverAction = b.ApproverAction 
and a.ApprovalTime = b.sTime
and a.approver = b.approver
and a.eftrecIDNum = b.EFTRecIDNum

也许时间重复了,所以我们可能需要注销ID?

SELECT
    a.EFTRecIDNum,
    a.Approver, 
    a.ApprovalTime, 
    a.ApproverAction
FROM tblApprover a 
INNER JOIN (SELECT ApproverAction, MAX(ID) as mID, Approver, EFTRecIDNum
            FROM tblApprover 
            GROUP BY ApproverAction, Approver, EFTRecIDNum) b 
 on a.ApproverAction = b.ApproverAction 
and a.ID = b.mid
and a.approver = b.approver
and a.eftrecIDNum = b.EFTRecIDNum

这两个查询之间的唯一区别是,根据(批准者,ApprovalAction和EFTRecIDNum),我们用来定义“ UNIQUE”记录的条件是什么。如果可以为给定的“唯一”重复ApprovalTime,则Approvaltime不够唯一。

通常,ID是唯一的,并且在Access中是连续的(如果是自动编号),因此我假设我们可以将其作为唯一值来键入。由于您只希望每个批准人,批准人和EFTRecIDNum有1条记录,因此我们简单地让系统选择了最高记录ID。 然后,通过将此子集重新加入所有数据,我们可以消除EFTRecIDNum,Approver和ApproverAction组合中除最高ID之外的所有ID。 这使我们能够找到时间最长的那个。 (如果需要,可能还有其他数据)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM