我需要创建一个给出前两个表(A和B)的视图,我得到的结果如表C所示。
基本上我需要填充表B上的空白区域,使用前面提供的第一个值,如下所示。
我在程序中使用两个循环完成了这项工作,但我想尝试使用select语句来解决这个问题。
表-A
日期
2013年1月1日
2013年2月1日
2013年3个月
2013年4月1日
2013年5月1日
2013年6月1日
2013年7月1日
2013年8月1日
2013年9月1日
2013年10月1日
....
表-B
日期值
1/1/2013 10
3/1/2013 5
2013年7月1日30
10/1/2013 40
table_c - 期望的结果
日期值
1/1/2013 10
2013年2月1日10
3/1/2013 5
4/1/2013 5
5/1/2013 5
2013年6月1日5
2013年7月1日30
2013年8月1日30
9/1/2013 30
10/1/2013 40
有人对如何做到这一点有任何想法吗?
答案 0 :(得分:0)
我的sql非常生疏,所以我有这种唠叨的感觉,这是一种更好的方式,但我想到的是加入一个子选择,这是table_b的自连接,以创建一个带有日期范围的新表b。有了这个,很容易将table_a与正确的值匹配。
我在sqlfiddle上留下了一个测试,所以你可以看到我做出的假设。这是下面的代码:
select date_format(a.date,'%m/%d/%Y') as date, b.value as value
from table_a as a join
(select b1.date as start, IFNULL(min(b2.date),'9999-12-31') as end, b1.value as value
from table_b as b1 left outer join table_b as b2
on b1.date < b2.date
group by b1.date) as b
on a.date >= b.start and a.date < b.end
自我联接使用group by修剪额外的b2条目,并获取大于b1日期的min b2日期。在最后一个条目的情况下,没有更大的b2日期,因此它最终为null;我将12/31/9999映射为一个非常大的日期。