2015-08-31 3 views
0

J'ai cette table SQLSQL: Aucune donnée pour une seule date, avec le prochain

date value 
2014-01-02 00:00:00.000 524,61 
2014-01-03 00:00:00.000 529,55 
2014-01-04 00:00:00.000 NULL 
2014-01-05 00:00:00.000 NULL 
2014-01-06 00:00:00.000 528,80 
2014-01-07 00:00:00.000 531,14 
2014-01-08 00:00:00.000 531,65 
2014-01-09 00:00:00.000 532,14 
2014-01-10 00:00:00.000 533,97 
2014-01-11 00:00:00.000 NULL 

je dois remplir toutes les valeurs NULL avec la prochaine valeur non nulle.

grâce

+0

Définir 'prochaine valeur'. La valeur à la prochaine date? –

+3

Quel est votre SGBD (SQL Server, MySQL, etc.)? –

+0

Et s'il vous plaît ajouter quelques informations sur votre modèle de données (requête, tables ...) –

Répondre

2

Voici un SELECT qui fait ce que vous voulez:

select t.date, t2.value 
from table t outer apply 
    (select top 1 t2.* 
     from table t2 
     where t2.date <= t.date and t2.value is not null 
     order by t2.date desc 
    ) t2; 

Cela peut aussi être formulée comme update, si vous souhaitez définir réellement les valeurs dans les données.

+0

cette requête renvoie '524.61' comme valeur pour toutes les lignes – SmartDev

+0

@SmartDev. . . Oui, la commande dans cross apply doit être dans la bonne direction, donc la première valeur n'est pas toujours retournée, –

0

DATE EXEMPLE:

declare @tbl table (Date INT, val INT) 
insert into @tbl values(1,524), (2,529), (3,NULL), (4,NULL), (5,531) 

QUERY

select Date, 
     coalesce(val,(select top 1 val 
        from @tbl t2 
        where val is not null and t1.Date < t2.Date 
        ) 
       ) Col_Without_NULLS 
from @tbl t1 
0

Merci à tous Le code était bien, mais le> était dans la direction opposée

select t.date, t2.value 
from #test t outer apply 
    (select top 1 t2.* 
     from #test t2 
     where t.date <= t2.date and 
     t2.value is not null 
     order by t2.date 
    ) t2; 
0

T son devrait fonctionner:

select 
    M.date, isnull(M.value, min(S.value)) as value 
from 
    @data M 
    left outer join @data S on M.date < S.date and S.value is not null 
group by 
    M.date, M.value 
order 
    by M.date