查询以完成Postgres中表上的空白空间

时间:2013-07-31 03:25:04

标签: sql view

我需要创建一个给出前两个表(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

有人对如何做到这一点有任何想法吗?

1 个答案:

答案 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映射为一个非常大的日期。