我正在处理一个select查询,该查询根据外键EFTRecIDNum为给定记录选择批准者列表。批准者列表存储在表tblApprover中,相关字段为EFTRecIDNum、Approver、ApprovalTime和ApproverAction。挑战在于,我需要给定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如果有什么我可以补充或澄清的,请告诉我。
编辑:添加了另一行数据以澄清。
发布于 2017-05-23 14:27:22
在我看来你的加入是不完整的你需要其他的领域..。
首先,我们为ApproverAction、审批人和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),如果ApprovalTime可以为给定的“唯一”复制,那么Approvaltime不够唯一。
通常ID是唯一的,并且在访问顺序中(如果是自动编号),所以我假设我们可以将它作为唯一的值,因为您只需要每个审批、批准者和EFTRecIDNum只需要一个记录,我们只需让系统选择ID最高的一个。然后,通过将这个子集加入到所有数据中,我们能够消除每个EFTRecIDNum、approver和approveraction组合中的所有ID(除了最高ID外)。这让我们找到了时间最长的那个。(如有需要,还可能提供其他数据)
https://stackoverflow.com/questions/44137405
复制相似问题