0

最初の 2 つのテーブル (A と B) を指定してビューを作成する必要があり、テーブル C のような結果が得られます。

基本的に、以下に示すように、利用可能な最初の前の値を使用して、テーブル B の空のスペースを埋める必要があります。

プロシージャで 2 つのループを使用してこれを達成しましたが、selects ステートメントだけを使用して解決策を試してみたいと思います。

table_a
日付
2013/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 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

自己結合は、余分な b2 エントリを group by で削除し、b1 の日付よりも大きい最小 b2 日付を取得します。最後のエントリの場合、b2 より大きい日付がないため、null になります。12/31/9999 にマップすると、非常に大きな日付になります。

于 2013-07-31T05:00:32.210 に答える