1

我有一个 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关键字不起作用,我认为变量必须在同一个选择上。我希望能够colsum在一个 sql 语句中计算和使用子查询。我想避免colsum在每个子查询中重新计算,因为最终我将使用更复杂的函数,如果每次重新计算,这些函数可能会减慢代码的速度。

我发现这个问题似乎几乎相同,但我没有设法使代码与该答案一起工作。

编辑:稍微更改了代码。

它实际上是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 中查找的输出的任何其他函数。

有没有办法做到这一点 ?

4

1 回答 1

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;
于 2013-08-06T16:27:50.403 回答