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)如其他评论中所问:您希望在概念上实现什么?从您的代码中,您似乎希望计算组观察到的最新测量值
和最小测量值
之间的比率,并将该信息作为新列添加到原始数据集中…(?)您好,谢谢您的回复!我如何使数据集在不更改数据集的情况下,每个主题、类型和日期只有一条记录?如果不修改数据集,则不可能使数据集在每个主题、类型和日期只有一条记录…这在逻辑上是不可能的。您应该分析业务问题,找出最重要的问题聚合其他列中包含的信息以实现每个主题、类型、日期一条记录的一种有效方法。假设您最重要的信息是度量值
,一种方法是对该列应用聚合函数,如平均值或总和,同时按主题、类型、日期
分组。(另一方面,如果您认为我的回答回答了您的问题,请随时接受我的回答,谢谢!)作为一名新的撰稿人,如果您认为您收到的回答对您的问题有帮助,我会向您指出该怎么做:您没有义务这样做,但这有助于社区。谢谢!)