2017-06-16 67 views
0

我在我的PostgreSQL 9.5数据库中有两个表,即tbl1tbl2。 TBL1包含(无时区的时间戳)数据,如:如何在PostgreSQL中插入缺失列的值?

Start_time    
1996-06-07 00:00:00  
1997-02-03 00:00:00  
2000-07-09 00:00:00 

tbl2包含这样一些值:

ID. veh_1995 veh_2000  
1  200   425   
2  400   478   
3  150   300   
4  700   800   
5  900   1500 

下面的查询插值(年列之间的间隙)失踪多年的值` tbl2的:

SELECT 
     veh_1995, 
     (veh_1995 + (veh_2000 - veh_1995) * 0.2)::int AS veh_1996, 
     (veh_1995 + (veh_2000 - veh_1995) * 0.4)::int AS veh_1997, 
     (veh_1995 + (veh_2000 - veh_1995) * 0.6)::int AS veh_1998, 
     (veh_1995 + (veh_2000 - veh_1995) * 0.8)::int AS veh_1999, 
     veh_2000 
from tbl2 

我需要修改上面的查询这样的:

  • tbl1每个start time行,查询应检查是否有一些失踪多年列tbl2
  • 如果是,那么插值那些缺少的列值,并参考返回所有列年start_time

预期输出:

Year   value 
1996   ... 
1997   ... 
2000   ... 

我会感激,如果有人可以帮我修改上面的查询得到我想要的输出?

+1

您对预期输出的描述是否完整?您的短语“在start_time中参考年份返回所有列”表明您也希望在输出中使用start_time。还要考虑一年的单个列的输出格式和该值可能更好地表示数据(并且更容易产生) - 对于您的tbl2也是如此。 –

+0

你可能是对的。原则上,我想在start_time中选择每年的值。如果缺少一些年份,则查询会插入并返回start_time中所有年份的值。因此,它可以在输出。只要编辑所需的输出。 –

回答

1

这是或多或少你在找什么?

with yrs as (
    select 
     t2.*, 
     start_time, 
     generate_series(cast(extract(year from start_time) as integer), 2000) as interp_yr 
    from 
     tbl2 as t2, 
     tbl1 as t1 
    where 
     extract(year from start_time) between 1995 and 2000 
    ) 
select 
    iy.*, 
    veh_1995 + (veh_2000 - veh_1995) * (interp_yr - 1995)/5 as interp_val 
from 
    yrs as iy;