我是一个相当新的访问并已采取lynda在线课程的查询,但我仍然无法弄清楚这个问题。我目前有一个查询返回2个不同的关系表中的以下信息。 Access实际上返回date1和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
我的目标是让查询返回唯一记录ID,其中包含日期1和日期2之间的最小(最小)差异(Abs(date1-date2)),以及所有相应的字段值(id,date1,date2, date1 lab value)。
预期产出:
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非常相似;但我想知道是否可以使用聚合查询和条件字段通过设计视图专门完成查询。
提前谢谢!
答案 0 :(得分:1)
这是一种方法:
SELECT ID, Date1, Date2, Date1_LabValue, Abs([Date1]-[Date2]) AS Diff
FROM Dataset
WHERE (((Abs([Date1]-[Date2]))=DMin("Abs([Date1]-[Date2])","Dataset","ID=" & [ID])));
“数据集”是包含示例中显示的数据的任何表或查询,但日期差异计算字段除外。我在这里计算。
答案 1 :(得分:0)
您的帖子声明您需要"唯一记录ID",但除非您提供有关数据或更多选择标准的更多详细信息,否则June7的答案仍可能会返回多行如果多行具有相同的最小日期差异,则使用相同的ID。
我猜测June7的查询不适合您,因为"数据集"在你的情况下是一个多表连接。相反,您需要先保存初始查询,然后将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
QUERY2:
SELECT ID, [Date 1], [Date 2], [Date 1 Lab Data], Diff
FROM Query1
WHERE (Query1.Diff = DMin("[Diff]","Query1","ID=" & [ID]))
以下替代方法可能比使用域聚合函数(即DMin)更有效,并且如果您必须绝对将结果限制为您所述的唯一ID,则可能更容易应用其他条件。不要让这种方法的多个查询欺骗你认为域聚合函数更好,因为它们看起来更短更清洁"。虽然可以按照您的要求在设计器中输入DMin的使用,但也可以仅使用设计器创建以下一组聚合查询。我当然发布了SQL,因为它比每一步显示一堆Designer屏幕截图更容易发布。
例如,为了确保ID的唯一性,假设我们不仅限制日期之间的差异,而是在与第一个条件存在多个匹配时选择最大[日期2]。 (但这仍然只假设[日期2]日期是唯一的,可能不是真的。如果NO数据保证唯一记录,您可以使用分组和其他聚合函数(例如MIN,MAX,LAST,FIRST)在最终查询以确保唯一ID但您必须注意所选日期1值仍然对应于Date 1 Lab值。)
以相同的Query1:
开头查询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 - 应用最终选择:
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);