2015-09-17 2 views
3

У меня есть данные ниже. Я хочу написать код sas proc sql, чтобы получить последние не пропущенные значения для каждого пациента (ptno).Как выполнить последнее наблюдение с использованием SAS PROC SQL

data sda; 
input ptno visit weight; 
format ptno z3. ; 
cards; 
1 1 122 
1 2 123 
1 3 . 
1 4 . 
2 1 156 
2 2 . 
2 3 70 
2 4 . 
3 1 60 
3 2 . 
3 3 112 
3 4 . 
; 
run; 

proc sql noprint; 
create table new as 
select ptno,visit,weight, 
case 
       when weight = . then weight 
       else . 
       end as _weight_1 
     from sda 
group by ptno,visit 
order by ptno,visit; 
quit; 

Неверный код sql не работает.

Выходные данные желание, как это:

ptno visit weight 
    1  1 122 
    1  2 123 
    1  3 123 
    1  4 123 
    2  1 156 
    2  2 . 
    2  3 70 
    2  4 70 
    3  1 60 
    3  2 . 
    3  3 112 
    3  4 112 
+3

Это проще в шаге данных с помощью 'retain', чем в родной' прок sql'. –

+0

Создание [tag: locf], поскольку это довольно большая группа проблем, которые мы получаем здесь. Пожалуйста, не стесняйтесь создавать теги wiki, если кто-то хочет - иначе я буду, когда у меня будет время. – Joe

+0

@joe, огромное спасибо! – johnww

ответ

1

Поскольку вы эффективно иметь номер строки (посещение), вы можете сделать это - хотя это гораздо медленнее, чем на этапе обработки данных.

Здесь он, разбитый в отдельный столбец для демонстрационных целей - конечно, в вашем случае вы захотите объединить это в один столбец.

В принципе, вам нужен подзапрос, который определяет максимальное число посещений, меньшее, чем текущее, у которого есть законный вес, и затем присоединяйте его к таблице, чтобы получить вес.

proc sql; 
    select ptno, visit, weight, 
    (
     select weight 
      from sda A, 
      (select ptno, max(visit) as visit 
       from sda D 
       where D.ptno=S.ptno 
       and D.visit<S.visit 
       and D.weight is not null 
       group by ptno 
      ) V 
      where A.visit=V.visit and A.ptno=V.ptno 
    ) 
    from sda S 
    ; 
quit; 
0

Хотя вы не охарактеризовали его таким образом, чтобы вы не переносили вперед 1-й вид вправо?

Я не знаю, почему вы хотели бы сделать это с помощью SQL. В SAS шаг данных намного лучше подходит для задачи. Мне нравится использовать «трюк обновления». Если вам интересно, как это работает, я оставлю это вам, чтобы изучить инструкцию UPDATE.

data locf; 
    update sda(obs=0 keep=ptno) sda; 
    by ptno; 
    output; 
    if visit eq 1 then call missing(weight); 
    run; 

enter image description here

Смежные вопросы