0

我需要创建一个给定前两个表(A 和 B)的视图,我得到的结果类似于表 C。

基本上我需要使用第一个可用的值来填充表 B 上的空白,如下所示。

我已经在一个过程中使用两个循环来完成此操作,但我想尝试仅使用 selects 语句的解决方案。

table_a
日期
1/1/2013
2/1/2013
3/1/2013
4/1/2013
5/1/2013
6/1/2013
7/1/2013
8/1/2013
9/1/2013
10/1 /2013
....

table_b
日期值2013 年 1 月 1 日
10 2013 年 3 月 1
日 5 2013 年 7 月 1
日 30 2013 年 10 月 1 日
40

table_c - 期望结果
日期值
1/1/2013 10
2/1/2013 10
3/1/2013 5
4/1/2013 5
5/1/2013 5
6/1/2013 5
7/1/2013 30
8/ 2013 年 1 月 30 日
2013 年 9 月 1 日30 2013 年 10 月 1 日
40

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

4

1 回答 1

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 日期,因此它最终为空;我映射到 12/31/9999 是一个非常大的日期。

于 2013-07-31T05:00:32.210 回答