找到最接近0的值

时间:2016-01-18 18:34:27

标签: sql ms-access-2010

我整个下午都在搜索我的查询答案,我完全陷入困境,所以希望有人能够解释我出错的地方。

我的第一张表是:

Blood Samples
PatientNumber        Date Sample Collected
------------------------------------------------

每位患者在此表中可能有多条记录,因为他们可能在多个日期提供了血液样本。

我还有另一张表(实验室测试),列出了可能在每个患者的不同日期进行的实验室测试:

Lab Tests
PatientNumber     TestDate
----------------------------------

我想要做的是找到每个实验室测试日期最接近的血液样本日期。

我创建了一个查询(qry_All Samples和Tests),在两个表之间加入PatientNumber。所以在这个查询中我有字段:

Patientnumber,
Date Sample Collected (from Blood Samples),
Test Date (from Lab Tests)

由于这是一个多对多的连接,查询返回了很多多余的结果。

然后我在一个名为“样本日期和测试日期之间的天差”的新列中添加了一个表达式,以显示每个记录中收集的日期样本和测试日期之间的天数:

DateDiff("d",[Blood Samples]![Date Sample Collected],[Lab Tests]![Test Date])

在将上面的表达式添加到我的查询(qry_All Samples and Tests)之前,我尝试运行以下SQL代码来找到最接近测试日期的日期样本,但它所做的只是返回日期之间的完全匹配:

SELECT Patientnumber, [Date Sample Collected], [Test Date]
FROM [qry_All Samples and Tests]
WHERE abs(datediff("d",[Date Sample Collected],[Test Date]))
= ( select min(
abs(datediff("d",[Date Sample Collected],[Test Date]))
)
from [qry_All Samples and Tests] );

我知道有一些血液样本,其中最近的测试日期与收集的日期样本不在同一天,所以我知道上面的SQL在运行时缺少一堆记录。

在我的查询(qry_All样本和测试)中添加“样本日期和测试日期之间的天差”列后,我尝试找到一种方法只返回此列最接近0(天)的记录但是我发现的每一篇文章都是从价值的一个方向进行搜索 - 在价值之前或之后。我的“采样日期和测试日期之间的天差”列包含负值和正值,因此我不能使用此值的最小值或最大值。我需要找到在收集日期样本之前或之后发生的最接近的测试日期。

我意识到测试日期可能与收集的日期样本两侧的距离相等,但没关系。我只需要进入我将返回的最接近的测试日期返回到收集日期样本的阶段。

我希望所有这一切都有道理,我非常感谢任何建议。

2 个答案:

答案 0 :(得分:1)

好的,所以我已经解决了......

这是我的第一个查询(qry_All样本和测试):

SELECT [Blood Samples].Patientnumber, [Blood Samples].[Date Sample Collected], [Lab Tests].StudyNumber, [Lab Tests].[Test Date], Abs(DateDiff("d",[Blood Samples]![Date Sample Collected],[Lab Tests]![Test Date])) AS [Date difference]
FROM [Blood Samples] INNER JOIN [Lab Tests] ON [Blood Samples].Patientnumber = [Lab Tests].StudyNumber
WHERE ((([Lab Tests].[Test Date]) Is Not Null));

与上述的主要区别在于我使用了表达式Abs(DateDiff(" d",[血液样本]![收集日期样本],[实验室测试]![测试日期])不只是(DateDiff(" d",[血液样本]![收集日期样本],[实验室测试]![测试日期])。这样做意味着在这个新专栏中返回的数字(日期差异) )都是积极的。

然后,这允许我在新查询中搜索日期差异列中的最小值(qry_Closest Viral Load to Sample),它返回日期差异列中最接近0的记录:

SELECT [qry_All Samples and Tests].Patientnumber, [qry_All Samples and Tests].[Date Sample Collected], Min([qry_All Samples and Tests].[Date difference]) AS [MinOfDate difference]
FROM [qry_All Samples and Tests]
GROUP BY [qry_All Samples and Tests].Patientnumber, [qry_All Samples and Tests].[Date Sample Collected];

然后我能够将这个新查询链接回原始查询(qry_All Samples and Tests)以获取我需要的完整数据字段集:

SELECT [qry_All Samples and Tests].Patientnumber, [qry_All Samples and Tests].[Date Sample Collected], [qry_All Samples and Tests].[Test Date], [qry_All Samples and Tests].[Date difference]
FROM [qry_Closest Viral Load to Sample] INNER JOIN [qry_All Samples and Tests] ON ([qry_Closest Viral Load to Sample].[MinOfDate difference] = [qry_All Samples and Tests].[Date difference]) AND ([qry_Closest Viral Load to Sample].[Date Sample Collected] = [qry_All Samples and Tests].[Date Sample Collected]) AND ([qry_Closest Viral Load to Sample].Patientnumber = [qry_All Samples and Tests].Patientnumber)
ORDER BY [qry_All Samples and Tests].Patientnumber, [qry_All Samples and Tests].[Date Sample Collected];

我希望这有助于将来尝试找到最接近0的值,并感谢Gustav为我的问题提供可能的解决方案

答案 1 :(得分:0)

您似乎只需要过滤 Patientnumber

SELECT 
    Patientnumber, 
    [Date Sample Collected], 
    [Test Date]
FROM 
    [qry_All Samples and Tests]
WHERE 
    Abs(DateDiff("d",[Date Sample Collected],[Test Date])) =

    (Select Min(Abs(DateDiff("d",T.[Date Sample Collected],T.[Test Date])))
    From [qry_All Samples and Tests] As T
    Where T.Patientnumber = [qry_All Samples and Tests].Patientnumber);

但是,由于一个日期差异可能与同一患者数字的另一组日期相匹配,因此您可能必须通过查询运行输出以符合您的目的。