Select SAS错误:子查询计算到多行

Select SAS错误:子查询计算到多行,select,sas,subquery,syntax-error,proc-sql,Select,Sas,Subquery,Syntax Error,Proc Sql,我收到消息“错误:子查询计算到多行。我已在下面发布了工作代码。我想知道如何解决此错误。提前感谢您 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

我收到消息“错误:子查询计算到多行。我已在下面发布了工作代码。我想知道如何解决此错误。提前感谢您

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;

在现实生活中使用的完整数据集上运行查询时,之所以会收到消息“ERROR:Subquery evaluated to more one row”(错误:子查询求值超过一行),是因为至少对一个分组变量组合重复了
max(date)
值(即根据上述评论,我们假设中的
主题
类型

事实上,对于每个分组变量组合,在子查询
having date=max(date)
中应用的条件将返回与
date
等于
max(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;
如果在输入数据集中运行此代码(我已将记录12的
measurement
的值从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

(*)此查询正常工作的实际条件是,每个
主题
类型
,“最大(日期)超过主题类型”都有一条记录,尽管此条件(在
最大(日期)
上保证唯一性,而不是每个
日期
组)不太可能发生在实际的商业案例中。

您将参考哪种版本的日期和度量值?每个受试者应该有一个比率值,还是每个受试者/类型/程序应该有一个比率值?假设我是Brickskkull,您能说明在比率计算中应该有哪些特定值吗?数据总是可以排序的,是吗示例数据中出现混乱是有原因的。对于您显示的输入,您期望的答案是什么?在一个SQL查询中,这当然是一个令人印象深刻的问题列表。我已经发现了5个问题,甚至不知道您试图实现什么。我在运行代码时没有发现错误。我只是得到了提示“注意:查询需要将摘要统计信息与原始数据重新合并。”(Windows上的SAS 9.4)如其他评论中所问:您希望在概念上实现什么?从您的代码中,您似乎希望计算组观察到的最新
测量值
和最小
测量值
之间的比率,并将该信息作为新列添加到原始数据集中…(?)您好,谢谢您的回复!我如何使数据集在不更改数据集的情况下,每个主题、类型和日期只有一条记录?如果不修改数据集,则不可能使数据集在每个主题、类型和日期只有一条记录…这在逻辑上是不可能的。您应该分析业务问题,找出最重要的问题聚合其他列中包含的信息以实现每个主题、类型、日期一条记录的一种有效方法。假设您最重要的信息是
度量值
,一种方法是对该列应用聚合函数,如平均值或总和,同时按
主题、类型、日期
分组。(另一方面,如果您认为我的回答回答了您的问题,请随时接受我的回答,谢谢!)作为一名新的撰稿人,如果您认为您收到的回答对您的问题有帮助,我会向您指出该怎么做:您没有义务这样做,但这有助于社区。谢谢!)