2017-05-05 2 views
0

Ich brauche Lücken in meiner Tabelle ausfüllen. JEDE ID (x) kann mehr als ein CKD_STAGE haben, aber es gibt einige Monate mit Nullwerten. Ich möchte die Zwischenräume mit dem letzten bekannten CKD_STAGE füllen. Hier ist, was ich bisher habe.Füllen Sie Lücken zwischen den Daten

SELECT DISTINCT DOS, x, CKD_STAGE, REF_YEAR 
FROM #CKD_MM 

DECLARE @MAXDOS INT = (SELECT MAX(DOS) FROM #CKD_MM) 
DECLARE @MINDOS INT = (SELECT MIN(DOS) FROM #CKD_MM) 

Update #CKD_MM 
set CKD_STAGE = @MAXDOS 
WHERE CKD_STAGE is null 
     AND DOS BETWEEN @MAXDOS AND @MINDOS 

Meine Logik unterscheidet sich x-ID und schauen Sie sich die Termine (DOS) und CKD_Stage für jede eindeutige ID zu finden. Betrachte das maximale und minimale Datum für jede ckd_stage und fülle die Lücken dazwischen mit dem maximalen Wert. Das Programm läuft, aber ich bekomme immer noch NULL-Werte.

Hier ist eine Momentaufnahme dessen, was die Tabelle sieht aus wie mit einem der

DOS  x   CKD_STAGE REF_YEAR 
201405 480000000 2  2014 
201510 480000000 NULL 2015 
201504 480000000 NULL 2015 
201506 480000000 NULL 2015 
201512 480000000 NULL 2015 
201511 480000000 NULL 2015 
201409 480000000 2  2014 
201509 480000000 3  2015 
201507 480000000 NULL 2015 
201404 480000000 NULL 2014 
201501 480000000 NULL 2015 
201411 480000000 NULL 2014 
201402 480000000 NULL 2014 
201503 480000000 NULL 2015 

von id Also muss ich alle NULLS mit Daten vor 201.509 2 sein, und alle nach 201.509 3. Ich habe 1000 sein von Aufzeichnungen, damit ich über eine Reihe von verschiedenen IDs und verschiedenen CKD_STAGES arbeiten muss.

Antwort

0

Wenn ich richtig verstehe, wollen Sie den Nullwert Spalte einstellen 2 sein, wenn es vor dos Spaltenwert ist 201.509 und 3, wenn es nach ist 201509.

Update #CKD_MM 
set CKD_STAGE = case when dos>=201509 then 3 else 2 end 
WHERE CKD_STAGE is null 
+0

Nein, ich brauche sie alle Wertebereich für das Datum zu arbeiten über und CKD_STAGE, ich habe 100 von den Aufzeichnungen über die Tabelle ist nur eine Momentaufnahme von 1 Datensatz (eine ID). –

+0

Sie können Fallanweisungen für diese Bereichswerte schreiben. Sie können Ihr Szenario bereitstellen, so dass ich Ihnen für Ihren Wertebereich helfen kann – Rams

0

apply() mit dem vorherigen zu erhalten und nächste nicht null Werte für ein gegebenes x

select 
    t.dos 
    , t.x 
    , coalesce(t.ckd_stage,prev.ckd_stage,nxt.ckd_stage) as ckd_stage 
    , t.ref_year 
from t 
    outer apply (
    select top 1 i.ckd_stage 
    from t i 
    where i.x = t.x 
     and i.dos > t.dos 
     and i.ckd_stage is not null 
    order by i.dos asc 
) nxt 
outer apply (
    select top 1 i.ckd_stage 
    from t i 
    where i.x = t.x 
     and i.dos < t.dos 
     and i.ckd_stage is not null 
    order by i.dos desc 
) prev 
order by t.dos 

als update

update t 
set ckd_stage = coalesce(prev.ckd_stage,nxt.ckd_stage) 
from t 
    outer apply (
    select top 1 i.ckd_stage 
    from t i 
    where i.x = t.x 
     and i.dos > t.dos 
     and i.ckd_stage is not null 
    order by i.dos asc 
) nxt 
outer apply (
    select top 1 i.ckd_stage 
    from t i 
    where i.x = t.x 
     and i.dos < t.dos 
     and i.ckd_stage is not null 
    order by i.dos desc 
) prev 
where t.ckd_stage is null 

select * 
from t 
order by dos 

rextester Demo: http://rextester.com/YFTM98118

kehrt:

+--------+-----------+-----------+----------+ 
| dos |  x  | ckd_stage | ref_year | 
+--------+-----------+-----------+----------+ 
| 201402 | 480000000 | 2   |  2014 | 
| 201404 | 480000000 | 2   |  2014 | 
| 201405 | 480000000 | 2   |  2014 | 
| 201409 | 480000000 | 2   |  2014 | 
| 201411 | 480000000 | 2   |  2014 | 
| 201501 | 480000000 | 2   |  2015 | 
| 201503 | 480000000 | 2   |  2015 | 
| 201504 | 480000000 | 2   |  2015 | 
| 201506 | 480000000 | 2   |  2015 | 
| 201507 | 480000000 | 2   |  2015 | 
| 201509 | 480000000 | 3   |  2015 | 
| 201510 | 480000000 | 3   |  2015 | 
| 201511 | 480000000 | 3   |  2015 | 
| 201512 | 480000000 | 3   |  2015 | 
+--------+-----------+-----------+----------+ 
+0

Das funktioniert nicht, es produziert immer noch NULL-Werte. –

+0

@ C.AJ kombiniert meine vorherige Antwort in eins. – SqlZim

Verwandte Themen