Ошибка SAS: подзапрос оценивается более чем в одну строку - PullRequest
0 голосов
/ 19 марта 2020

Я получаю сообщение «ОШИБКА: Подзапрос оценен для более чем одной строки. Я разместил рабочий код ниже. Я хотел бы знать, как можно устранить эту ошибку. Заранее спасибо.

data have;
input Subject Type :$12. Date &:anydtdte. Procedure :$12. Measurement;
format date yymmdd10.;
datalines;

500   Initial    15 AUG 2017      Invasive     20 
500   Initial    18 SEPT 2018     Surface      35 
500   Followup   12 SEPT 2018     Invasive     54 
428   Followup    2 JUL 2019      Outer        29 
765   Seventh     3 JUL 2018      Other        13 
500   Followup    6 NOV 2018      Surface      98 
428   Initial     23 FEB 2018     Outer        10 
765   Initial     20 AUG 2019     Other        19 
610   Third       21 AUG 2018     Invasive     66 
610   Initial     27 Mar 2018     Invasive     17 
999   Dummy       17 mar 2020     Some          1
999   Dummy       18 mar 2020     Some          2
999   Dummy       19 mar 2020     Some          3
;

proc sql;
create table want as
select *,
    (select max(measurement) 
     from have 
     where subject=a.subject and type=a.type and procedure=a.procedure 
     having date = max(date)) / min(measurement) as ratio
from have as a
group by subject, type, procedure
order by subject, date;
quit;

1 Ответ

0 голосов
/ 24 марта 2020

Причина, по которой вы получаете сообщение «ОШИБКА: подзапрос оценен более чем в одну строку» при выполнении запроса к полному набору данных , с которым вы работаете в реальной жизни , заключается в том, что у вас есть * Значение 1003 * повторяется для хотя бы для одной комбинации группирующих переменных (т. Е. subject и type в нашем предположении согласно приведенным выше комментариям).

Фактически, условие, которое вы применяете в подзапросе having date = max(date) вернет столько строк, сколько записей, имеющих date, равный max(date) для каждой комбинации переменных группировки.

Я предлагаю вам убедиться, что ваш входной набор данных имеет только ОДНУ ЗАПИСЬ за subject, type, date. (*)

Если вы сделаете это, ваш запрос будет работать нормально (хотя вы могли бы заменить max(measurement) просто measurement в своем подзапросе поскольку в каждой группе будет только одна запись с date = max(date)).

Итак, окончательный запрос будет:

PROC SQL;
    create table want as
    select a.*,
        (select measurement as measurement_last_date
         from have
         where subject = a.subject and type = a.type 
         having date = max(date)) / min(a.measurement) as ratio
    from have as a
    group by subject, type
    order by subject, type, date;
QUIT;

Если вы запустите этот код во входном наборе данных (где я изменили значение measurement для записи 12 от 2 до 0,2, чтобы сделать результат более ясным), вы получите:

Obs    Subject    Type              Date    Procedure    Measurement     ratio
 1      428      Followup    2019-07-02    Outer            29.0        1.0000
 2      428      Initial     2018-02-23    Outer            10.0        1.0000
 3      500      Followup    2018-09-12    Invasive         54.0        1.8148
 4      500      Followup    2018-11-06    Surface          98.0        1.8148
 5      500      Initial     2017-08-15    Invasive         20.0        1.7500
 6      500      Initial     2018-09-18    Surface          35.0        1.7500
 7      610      Initial     2018-03-27    Invasive         17.0        1.0000
 8      610      Third       2018-08-21    Invasive         66.0        1.0000
 9      765      Initial     2019-08-20    Other            19.0        1.0000
10      765      Seventh     2018-07-03    Other            13.0        1.0000
11      999      Dummy       2020-03-17    Some              1.0       15.0000
12      999      Dummy       2020-03-18    Some              0.2       15.0000
13      999      Dummy       2020-03-19    Some              3.0       15.0000

(*) Фактическое условие для этого запроса для работы без ошибок - одна запись на subject, type, "max (date) over-type-type" , хотя это условие (где уникальность гарантируется для max(date), а не для каждые date на группу) вряд ли произойдет в реальном экономическом случае.

...