Microsoft Access SQL - 选择最新版本"版本"记录

时间:2017-05-23 14:19:39

标签: sql ms-access

我正在处理一个选择查询,该查询根据外键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号为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

如果有任何我可以添加或澄清的内容,请告诉我。

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

1 个答案:

答案 0 :(得分:2)

对我来说,你的加入是不完整的,你需要其他领域...

首先,我们为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

两个查询之间的唯一区别是我们用来根据(approver,ApprovalAction和EFTRecIDNum)定义“UNIQUE”记录。如果可以为给定的“Unique”复制ApprovalTime,那么Approvaltime不够独特。

通常ID是独一无二的并且在Access顺序中(如果是自动编号)所以我假设我们可以将它作为一个唯一值关闭因为你只需要每个批准,批准者和EFTRecIDNum 1个记录,我们只需要系统选择一个ID最高的。然后,通过将此子集连接回所有数据,我们能够消除EFTRecIDNum,Approver和ApproverAction的每个组合中除最高ID之外的所有ID。这使我们能够找到时间最长的那个。 (如果需要可能还有其他数据)