根据给定日期选择最新值

时间:2015-10-02 10:56:54

标签: sql ms-access access-vba

在Access I中使用此虚拟表(table1),我想用下面显示的逻辑更新table2的字段。例如,对于ID = 1,table2中field2的所有值应该具有值10,而Date是< 1/1/2015,并且该日期之后的所有值应该具有值8,依此类推。

Table1
ID    field1      reviewDate
1        10       1/1/2014    
1        8        1/1/2015
2        5        3/3/2013
2        6        4/4/2014
2        4        5/5/2015

Table2
ID    field2     Date
 1     10         1/1/2014
 1     10         2/1/2014
 .       .          .
 .       .          .
 1      8         1/1/2015

我首先尝试使用select语句,看看我对所需结果的接近程度如下:

select a.ID, field1, max(reviewDate) as max , b.Date 
from table1 a  
inner join table2 b 
on a.ID=b.ID 
and b.Date >=a.reviewDate
group by ID,field1,reviewDate,Date 
order by a.ID,b.Date

问题显然是当Date大于两个相同ID的reviewDates时,返回同一Date的两个值。我只想要当代。例如,对于ID = 1,日期= 2/1 / 2015 field2 = 8,但在我的脚本中,日期= 2/1/2015我有两条记录10和8。

2 个答案:

答案 0 :(得分:0)

我会用相关的子查询来做这个:

select t2.*,
       (select top 1 t1.field1
        from table1 t1
        where t1.id = t2.id and t1.reviewDate <= t2.Date
        order by t1.reviewDate desc, t1.field1
       ) as field1
from table2 as t2;

答案 1 :(得分:0)

我找到了一个解决方案,可能不是最有效的,但仍然是一个解决方案。

我将ID,日期和相应的reviewDate存储在工作/临时表中。使用此查询:

select a.ID,a.Date,max(ReviewDate) as RevDate 
into temp1 
from table1 a 
inner join table2 b on a.ID=b.ID and a.Date>=b.ReviewDate 
group by a.ID,a.Date

然后我在table2,ReviewDate列中添加一个额外的列,更新加入temp1表的值

update table2 a 
inner join temp1 b on a.ID=b.ID and a.date=b.date 
set a.reviewDate=b.RevDate

然后我更新了在ID,date和reviewDate上加入table1的field2值。

update table2 a 
inner join table1 b
on a.ID=b.ID and a.Date=b.Date and a.ReviewDate=b.Reviewdate 
set a.field2=b.field1

我猜有些步骤可以合并,但我没有时间正确检查。随意提供更有效的解决方案。谢谢大家