首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择最新的记录“版本”

选择最新的记录“版本”
EN

Stack Overflow用户
提问于 2017-05-23 14:19:38
回答 1查看 54关注 0票数 0

我正在处理一个select查询,该查询根据外键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以外的所有内容。

我用联接和子选择尝试了一些不同的东西,但总是只选择最近的审查员/审批人。

代码语言:javascript
运行
复制
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

如果有什么我可以补充或澄清的,请告诉我。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 14:27:22

在我看来你的加入是不完整的你需要其他的领域..。

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

代码语言:javascript
运行
复制
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?

代码语言:javascript
运行
复制
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外)。这让我们找到了时间最长的那个。(如有需要,还可能提供其他数据)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44137405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档