我对PROC SQL专家提出了一个问题。我有这段代码:
proc sql;
create table FinalData as
select *
,Sum(starting_year,year_diff) as colsum
,Price*(1+(SELECT Return from OtherData where Year=calculated colsum)) as PriceFinal
from MainData;
quit;
显然calculated
关键字不起作用,我认为变量必须在同一个选择上。我希望能够在一个sql语句中计算和使用子查询中的colsum
。我想避免在每个子查询中重新计算colsum
,因为最终我将使用更复杂的函数,如果每次重新计算,可能会减慢代码速度。
我发现这个question似乎差不多,但我没有设法使代码与该答案一致。
编辑:稍微更改了代码。
实际上它应该是Year=calculated colsum
。 OtherData基本上是一个引用表,其中Year
没有重复项。这是一个例子:
MainData OtherData
[Price] [starting_year] [year_diff] [Return] [Year]
5.00 2010 5 0.04 2015
2.33 2013 3 0.02 2016
4.51 2011 1 0.005 2017
0.1 2018
会有缺失值,那很好。我知道这可以通过多个proc sql语句轻松完成,但挑战是在单个语句中完成。 SUM
可以是生成要在OtherData中查找的输出的任何其他函数。
有办法做到这一点吗?
答案 0 :(得分:2)
特定问题的一个部分解决方案是将您的功能定义为功能。 SQL可能足够聪明,不能重新计算两次相同的东西,虽然当然使用SQL你永远不知道 - 但它值得一试。至少使用已编译的函数,您可以获得一些效率,并且可以使用更多的SQL指针来正确执行它。
proc fcmp outlib=work.funcs.test;
function bmi(weight,height);
return (weight/height**2);
endsub;
quit;
options cmplib=work.funcs;
proc sql;
select bmi(weight,height) as bmi,
(select count(1) from sashelp.class S where bmi(s.weight,s.height) le bmi(c.weight,c.height)) as less
from sashelp.class C;
quit;
您还可以使用计算变量创建视图并使用:
proc sql;
create view temp as select *, bmi(weight,height) as bmi from sashelp.class;
create table mytable as select C.*, (select count(1) from sashelp.class S where bmi(s.weight,s.height) le C.bmi) from temp C;
quit;