根据表单字段中提供的日期查询 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 中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章