根据表单字段中提供的日期查询 MS Access 中的最新记录

Posted

技术标签:

【中文标题】根据表单字段中提供的日期查询 MS Access 中的最新记录【英文标题】:Query Most Recent Records in MS Access Based on Date Provided in Form Field 【发布时间】:2019-06-08 21:31:41 【问题描述】:

首先让我注意到我花了几天时间搜索 S.O.并且无法找到解决方案。如果解决方案非常简单,我提前道歉,但我仍在学习并感谢我能得到的任何帮助。

我有一个 MS Access 2010 数据库,我正在尝试创建一组查询来通知其他表单和查询。有两个表:借款人联系信息 (BC_Info) 和基本财务指标 (BF_Indicators)。每个月,我都会审查和跟踪每个借款人的关键绩效指标。我想创建一个基于文本框输入(Forms![Portfolio_Review Menu]!Text47)提供最新记录的查询。

我在“greatest-n-per-group”标签中看到的其他帖子有两个考虑因素:

    并非每个借款人每个月都有数据。 我需要能够及时查看,即如果是 2019 年 1 月 1 日,我想查看截至 2017 年 7 月 31 日的指标,我想 当然,我只看到 2017 年 7 月 31 日之前的数据,但接近 尽可能在这个日期。

字段如下:

BC_Info - 借款人姓名 -合作伙伴ID

BF_Indicators -Fin_ID -日期更新

表通过 BorrowerName 连接——这是用于 BC_Info 主键的唯一命名约定。

我目前拥有的是:

SELECT BCI.BorrowerName, BCI.PartnerID, BFI.Fin_ID, BFI.DateUpdated
FROM ((BC_Info AS BCI
    INNER JOIN  BF_Indicators AS BFI
        ON BFI.BorrowerName = BCI.BorrowerName)
    INNER JOIN
    (
        SELECT Fin_ID, MAX(DateUpdated) AS MAX_DATE
        FROM BF_Indicators
        WHERE (DateUpdated <= Forms![Portfolio_Review Menu]!Text47 OR
        Forms![Portfolio_Review Menu]!Text47 IS NULL)
        GROUP BY Fin_ID
    ) AS Last_BF ON BFI.Fin_ID = Last_BF.Fin_ID AND
        BFI.DateUpdated = Last_BF.MAX_DATE);

这为我提供了我需要的字段,并将保留文本框中给出的日期之后的记录,但将提供文本框输入之前的所有记录——而不仅仅是最近的。

结果(输入日期为 2018 年 12 月 31 日;MEHN-45543 仅是信息晚于 2018 年 9 月 30 日的借款人):

BorrowerName    PartnerID   Fin_ID  DateUpdated 
 MEHN-45543         19         9    12/31/2018 
 ARYS-7940           5        10     9/30/2018 
 FINS-21032         12        11     9/30/2018
 ELET-00934          9        12     9/30/2018
 MEHN-45543         19        18     9/30/2018

预期结果(输入日期为 2018 年 12 月 31 日;MEHN-45543 仅是信息晚于 2018 年 9 月 30 日的借款人):

BorrowerName    PartnerID   Fin_ID  DateUpdated 
 MEHN-45543         19         9    12/31/2018 
 ARYS-7940           5        10     9/30/2018 
 FINS-21032         12        11     9/30/2018
 ELET-00934          9        12     9/30/2018

如前所述,我计划使用此查询的结果来生成进一步的查询,这些查询使用财务指标中的汇总信息来确定当时的投资组合质量。

如果我可以提供任何其他信息,请告诉我。再次感谢您。

【问题讨论】:

在帖子中提供示例原始数据集作为文本,而不是图像。是否有唯一标识符字段,例如自动编号? 感谢 June7 的建议。我已经添加了示例数据——这是你的意思还是其他更有帮助的东西? PartnerID 是 BC_Info 表中的唯一标识符,Fin_ID 是 BF_Indicators 中的唯一标识符。两者都是自动编号。 您仍然显示示例结果,而不是示例原始源数据。但我想我还是把表格弄好了。 您为什么不使用 PartnerID 作为 PK/FK 而不是 BorrowerName? 谢谢 June7,这些似乎有效。我将继续对每一个进行试验,因为我会根据这些查询构建更多查询。至于 PK/FK 是 BorrowerName,我很困惑,认为 PK 需要能够连接到其他表。使用 BorrowerName 没有充分的理由,但它是一个独特的字段,所以我认为继续使用它没有害处。再次感谢您的帮助。 【参考方案1】:

尝试将 BC_Info 加入一个查询,该查询聚合了 BorrowerName 上的 BF_Indicators,而不是 Fin_ID。用文字日期值测试:

SELECT BC_Info.*, MaxDate 
FROM BC_Info 
INNER JOIN
(SELECT BorrowerName, Max(DateUpdated) AS MaxDate 
 FROM BF_Indicators WHERE DateUpdated <=#12/31/2018# GROUP BY BorrowerName) AS Q1 
ON BC_Info.BorrowerName=Q1.BorrowerName;

如果您需要在结果中包含 Fin_ID,则:

SELECT BC_Info.*, Fin_ID, DateUpdated FROM BC_Info 
INNER JOIN
(SELECT * FROM BF_Indicators WHERE Fin_ID IN 
    (SELECT TOP 1 Fin_ID FROM BF_Indicators AS Dupe 
     WHERE Dupe.BorrowerName=BF_Indicators.BorrowerName AND DateUpdated<=#12/31/2018# 
     ORDER BY Dupe.DateUpdated DESC)
) AS Q1
ON BC_Info.BorrowerName = Q1.BorrowerName;

如果您不喜欢 TOP N,请调整您的原始查询:

SELECT BCI.BorrowerName, BCI.PartnerID, BFI.Fin_ID, BFI.DateUpdated
FROM ((BC_Info AS BCI
    INNER JOIN  BF_Indicators AS BFI
        ON BFI.BorrowerName = BCI.BorrowerName)
    INNER JOIN
    (
        SELECT BorrowerName, MAX(DateUpdated) AS MAX_DATE
        FROM BF_Indicators
        WHERE (DateUpdated <= #12/31/2018#)
        GROUP BY BorrowerName
    ) AS Last_BF ON BFI.BorrowerName = Last_BF.BorrowerName AND
        BFI.DateUpdated = Last_BF.MAX_DATE);

还有 1 点需要考虑:

SELECT BC_Info.PartnerID, BC_Info.BorrowerName, BF_Indicators.Fin_ID, BF_Indicators.DateUpdated
FROM BC_Info RIGHT JOIN BF_Indicators ON BC_Info.BorrowerName = BF_Indicators.BorrowerName
WHERE (((BF_Indicators.DateUpdated)=DMax("DateUpdated","BF_Indicators","BorrowerName='" & [BC_Info].[BorrowerName] & "' AND DateUpdated<=#12/31/2018#")));

【讨论】:

以上是关于根据表单字段中提供的日期查询 MS Access 中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

查询不使用 MS-Access 中的日期条件进行拉取

MS Access 根据给定的日期范围选择查询字段

基于控件名称而不是控件源(字段)的 MS Access 计算

日期转换错误——MS Access前端查询sql后端

将MS Access表单日期传递到Oracle SQL

MS Access:如何使此文本框根据查询自动填充值?