查询最近的日期以及相应的值

Query for Nearest Dates, along with respective values

我对访问还很陌生,并且已经参加了有关查询的 lynda 在线课程,但我仍然无法弄清楚这个问题。我目前有一个查询 returns 类似于来自 2 个不同关系表的以下信息。实际上访问 returndate1 和 date2 的所有可能组合以及相关值,但为了简洁起见,我省略了其他结果。

ID        date1         date2         Abs(date1-date2)   Date1 Lab Value
510010    12/09/2013    12/10/2013    1                  6
510010    10/09/2013    12/09/2013    60                 12
510010    11/09/2013    09/10/2013    61                 5
510010    03/09/2013    03/15/2013    6                  4
510012    06/09/2013    06/09/2013    0                  4
510012    03/25/2013    03/15/2013    10                 1

我的目标是让查询 return 具有日期 1 和日期 2 (Abs(date1-date2)) 之间最小(最小)差异的唯一记录 ID,以及所有相应的字段值( id, date1, date2, date1 实验室值)。

预期输出:

ID        date1         date2         Abs(date1-date2)   Date1 Lab Value
510010    12/09/2013    12/10/2013    1                  6
510012    06/09/2013    06/09/2013    0                  4

这个问题和this link很相似;但是我想知道是否可以使用聚合查询和条件字段通过设计视图专门完成查询。

提前致谢!

这是一种方法:

SELECT ID, Date1, Date2, Date1_LabValue, Abs([Date1]-[Date2]) AS Diff
FROM Dataset
WHERE (((Abs([Date1]-[Date2]))=DMin("Abs([Date1]-[Date2])","Dataset","ID=" & [ID])));

"Dataset" 是任何 table 或使用示例中显示的数据进行查询,日期差异计算字段除外。我在这里计算。

你的 post 声明你想要 "unique record IDs",但除非你提供更多关于数据的细节或进一步的 selection 标准,否则 June7 的答案仍有可能 return 如果不止一行具有相同的最小日期差异,则同一 ID 的多行。

我猜 June7 的查询对您不起作用,因为在您的情况下 "Dataset" 是多 table 连接。相反,您需要先保存初始查询,然后将 June7 的提示应用于第一个查询:

查询 1:

SELECT Patients_t.ProstateID AS ID, PSA_t.PSA_Date AS [Date 1], MRI_t.MRI_Date AS [Date 2],
    PSA_t.PSa_Total AS [Date 1 Lab Data], Abs([PSA_date]-[MRI_Date]) AS Diff
FROM (Patients_t INNER JOIN PSA_t ON Patients_t.PatientID = PSA_t.PatientID)
    INNER JOIN MRI_t ON Patients_t.PatientID = MRI_t.PatientID

查询 2:

SELECT ID, [Date 1], [Date 2], [Date 1 Lab Data], Diff
FROM Query1
WHERE (Query1.Diff = DMin("[Diff]","Query1","ID=" & [ID]))

以下替代方法可能比使用域聚合函数(即 DMin)更有效,并且在您必须将结果绝对限制为您所述的唯一 ID 的情况下,应用其他标准可能更容易。不要让这种方法的多个查询让您误以为域聚合函数更好,因为它们看起来 "shorter and cleaner"。虽然可以按照您的要求在设计器中输入 DMin 的使用,但也可以仅使用设计器创建以下一组聚合查询。我当然 post SQL 因为 post 比为每个步骤显示一堆 Designer 屏幕截图更容易。

例如,为了确保 ID 的唯一性,假设我们不仅限制日期之间的差异,而且在第一个条件有多个匹配项时 select 最大 [Date 2]。 (但这仍然只假设 [Date 2] 日期是唯一的,这可能不是真的。如果没有数据保证唯一记录,您可以使用分组和进一步的聚合函数(例如 MIN、MAX、LAST、FIRST)在最终查询中确保唯一 ID,但您必须注意 selected Date 1 值仍然对应于 Date 1 Lab 值。)

从同一个查询 1 开始:

查询 3A - 获取最小日期差异:

SELECT ID, Min(Query1.Diff) AS [Min Diff]
FROM Query1
GROUP BY Query1.ID

查询 3B - 应用原始条件并为每个匹配获取最大日期 2:

SELECT ID, [Min Diff], Max(Query1.[Date 2]) AS [Max Date 2]
FROM Query3a INNER JOIN Query1
    ON (Query3a.ID = Query1.ID) AND (Query3a.[Min Diff] = Query1.Diff)
GROUP BY ID, [Min Diff]

查询 4 ​​- 应用最终 selection:

SELECT Query1.*
FROM Query3B INNER JOIN Query1
    ON (Query3B.[Max Date 2] = Query1.[Date 2])
    AND (Query3B.[Min Diff] = Query1.Diff) AND (Query3B.ID = Query1.ID);