按组填写缺失值

时间:2016-09-12 09:39:27

标签: sql sql-server missing-data

您好我有以下数据集,其中包含日期(始终从2015-01至2016-05期间),以及帐户和值(每个帐户将具有2015-01至2016-05期间)。

Date        Account    Value    
2015-05-01  Null       0
2015-06-01  Null       0  
2015-07-01  Null       0
2015-08-01  Null       0
2015-09-01  Null       0
2015-10-01  100        50
2015-11-01  Null       0 
2015-12-01  Null       0
2016-01-01  Null       0
2016-02-01  100        80  
2016-03-01  Null       0
2016-04-01  100        100
2016-05-01  Null       0
2015-05-01  200        200
2015-06-01  Null       0  
2015-07-01  Null       0
2015-08-01  Null       0
2015-09-01  Null       0
2015-10-01  200        50
2015-11-01  Null       0 
2015-12-01  Null       0
2016-01-01  Null       0
2016-02-01  200        80  
2016-03-01  Null       0
2016-04-01  200        100
2016-05-01  Null       0

我想填写Null和0,以便在2015-01至2016-05期间同一帐户no将在该期间出现(请参阅下表)。如果有可用的(如帐户200)或下一个值(作为帐户100),我还想更改该值,以便填充前一个值

Date        Account    Value    
2015-05-01  100        50
2015-06-01  100        50  
2015-07-01  100        50
2015-08-01  100        50
2015-09-01  100        50
2015-10-01  100        50
2015-11-01  100        50 
2015-12-01  100        50
2016-01-01  100        50
2016-02-01  100        80  
2016-03-01  100        80
2016-04-01  100        100
2016-05-01  100        100
2015-05-01  200        200
2015-06-01  200        200
2015-07-01  200        200
2015-08-01  200        200
2015-09-01  200        200
2015-10-01  200        50
2015-11-01  200        50
2015-12-01  200        50
2016-01-01  200        50
2016-02-01  200        80  
2016-03-01  200        80  
2016-04-01  200        100
2016-05-01  200        100

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

编辑:当表名为“test_account”并且我将列重命名为date_month,account_id和value_account时,这应该适用于您的输入数据。

在表中,日期是2015年1月15日至2016年1月15日的日期,如您的示例

with date_intervals as 
(
select a.*,
nvl(lag(date_month) over (partition by account_id order by date_month     asc),'01.01.1999') as start_date,
lead(date_month) over (partition by account_id order by date_month asc)     as end_date
from  test_account a 
where account_id is not null
)
select a.date_month,b.account_id,b.value_account 
from dates a 
join     date_intervals b on (a.date_month>b.start_date and     a.date_month<=b.date_month) 
or (a.date_month>b.date_month and end_date is null)