使用上次可用数据填写缺失的最新数据

时间:2013-01-03 18:13:02

标签: sql sql-server-2008 tsql

我有两个表,一个(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

尝试了很多不同的事情,但无法弄明白。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分: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  

答案 1 :(得分:1)

我认为你会从一个案例陈述中受益,这个没有经过测试,因为我没有一个小提琴来验证

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列的方法。