2013-01-03 37 views
1

我有兩個表,一個(market_cap_data)與month_end_date, id, market_cap領域缺少最新數據:填充在與最後一個可用的數據

month_end_date id   market_cap 
2012-12-31  123456  5000 
2011-12-31  123456  4000 

和第二個表(start_date_table)與month_end_date, id, start_date領域:

month_end_date id   start_date 
2011-12-31  123456  1980-12-31 

我想合併這兩個表,但start_date_table數據在market_cap_data表的前一年結束。我想使用最近的start_date填充start_date_table沒有數據的最新數據。例如,而不是外部的連接,如:

month_end_date id   market_cap start_date 
2012-12-31  123456  5000   NULL 
2011-12-31  123456  4000   1980-12-31 

我希望它看起來像

month_end_date id   market_cap start_date 
2012-12-31  123456  5000   1980-12-31 
2011-12-31  123456  4000   1980-12-31 

嘗試了一堆不同的東西,但不能弄明白。

任何幫助,將不勝感激!

+0

你能爲我們提供一個小提琴:sqlfiddle.com – Woot4Moo

回答

2
SELECT 
    m.month_end_date, 
    m.id, 
    m.market_cap, 
    CASE 
     WHEN s.start_date IS NOT NULL THEN s.start_date 
     ELSE (SELECT MAX(s2.start_date) FROM start_date_table s2 WHERE s2.id = m.id) 
    END AS start_date 
FROM market_cap_data m 
LEFT JOIN start_date_table s 
    ON m.id = s.id 
    AND m.month_end_date = s.month_end_date 
+0

非常優雅!這是一個很好的解決方案。謝謝! – eqsf

1

我認爲你會從一個case語句中受益,這不是測試,因爲我沒有一個小提琴來驗證

create function get_latest_date_from_table(varchar(100) table_name returns Date 
( 
    return select max(date) from #table_name 
) 

create procedure modify_null_dates_for_marker 
( 
    max_date Date; 
    max_date = get_latest_date_from_table('table'); 
    select 
     foo, 
     bar 
    CASE WHEN start_date IS NULL 
     THEN max_date 
     ELSE start_date END AS start_date 
    FROM table 
) 

這應該給予正確設置null列的方法。

+0

謝謝Woot4Moo!我做了一個小小的變化,但是這個概念很完美。 – eqsf

+0

@eqsf請告訴我變化是什麼,所以我可以通知未來的訪問者。 – Woot4Moo

相關問題