簡體   English   中英

根據表單字段中提供的日期查詢MS Access中的最新記錄

[英]Query Most Recent Records in MS Access Based on Date Provided in Form Field

讓我首先指出,我花了幾天時間搜索SO,但未能找到解決方案。 如果解決方案非常簡單,我先向您道歉,但我仍在學習並感謝我能獲得的任何幫助。

我有一個MS Access 2010數據庫,並且試圖創建一組查詢以告知其他表單和查詢。 有兩個表:借款人聯系信息(BC_Info)和基本財務指標(BF_Indicators)。 每個月,我都會審查和跟蹤每個借款人的關鍵績效指標。 我想創建一個查詢,該查詢提供基於文本框輸入(Forms![Portfolio_Review菜單]!Text47)的最新記錄。

我在'greatest-n-per-group'標簽中看到的其他帖子與以下兩個注意事項分開:

  1. 並非每個借款人都會獲得每個月的數據。
  2. 我需要能夠及時查看,即如果是2019年1月1日,並且我想查看截至2017年7月31日的指標,我想確保只看到2017年7月31日之前的數據,但是盡可能接近這個日期。

字段如下:

BC_Info-借款人名稱-PartnerID

BF_Indicators -Fin_ID -DateUpdated

這些表通過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

如前所述,我計划使用該查詢的結果來生成進一步的查詢,這些查詢使用來自財務指標的匯總信息來確定當時的投資組合質量。

請讓我知道我是否可以提供其他信息。 再一次,謝謝。

嘗試將BC_Info加入到查詢中,該查詢在BorrowerName而不是Fin_ID上聚合BF_Indicators。 用文字日期值測試:

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#")));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM