SQL查询:从表A中提取1行,其中表B中的数据更接近

时间:2016-08-25 15:09:49

标签: sql ms-access

MSAccess 数据库中有2个表:

表A

idA,data,idB

表B

idB,idC,data

表A连接表B到idB

我想提取

idA,A.data,A.idB,idC, B.data where B.data>=A.data

如果我获得多行

idA |A.data         |A.idB|idC  |B.data
1   | 17/04/2016    |1    |2    |19/05/2016
1   | 08/05/2016    |1    |3    |19/05/2016

我想只选择一行,其中A.data 更近到B.data,然后

1   | 08/05/2016    |1   |3 |19/05/2016

3 个答案:

答案 0 :(得分:1)

伪代码可能看起来像这样

select Top 1 ...
from ...
where B.data<=A.data
Order by datetime difference between B.data and A.data asc

答案 1 :(得分:1)

对于您的数据集,看起来您想要做的是:

  1. 对数据集进行细分/分组 - 对于B.data的任何给定值,有一个或多个A.data值的组A.data<=B.data
  2. 对于任何A.data值组,您对该组中只有一个 A.data值感兴趣:最接近{{1}的值该组的值。
  3. 所以,让我们考虑一下我们正在寻找的东西。在行中,我们只对感兴趣。这表明我们正在寻找类似于B.data等聚合函数的内容或SUM(),它采用一组值,执行计算,并返回一个值。

    MAX()SUM()的问题在于它们只允许您使用(并返回)单个标量值,但我们可以使用相关子查询添加一点复杂性,像这样:

    MAX()

    这种方法的一个潜在问题是,如果有多个具有相同日期的A.data值,您可能会获得这些值中的任何一个,除非您在其中应用其他订购子查询。

答案 2 :(得分:0)

测试:

表A

count

表B

ida data idB

1   19/05/2016  10

idB idC data

10  13  08/05/2016

10  51  17/04/2016

我得到了

select B.*, 
(select top 1 A.idA from A where A.data<=B.data order by A.data) as       
closestA_ID from B

但我只搜索一行:

idB idC data    closestA_ID
10  51  17/04/2016  
10  13  08/05/2016  

我错过了什么?