Причина, по которой вы получаете сообщение «ОШИБКА: подзапрос оценен более чем в одну строку» при выполнении запроса к полному набору данных , с которым вы работаете в реальной жизни , заключается в том, что у вас есть * Значение 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
на группу) вряд ли произойдет в реальном экономическом случае.