除了我的sasdate var外,我需要插入一排行,空白行,这是由于这种情况导致的:
if (17530 < sasdate < 20800) then sasdate = .
但是我似乎做不到。
proc sql;
create table ds as
select sasdate, avg(x) as avg_x
from ds1
group by sasdate;
insert into ds
if (17530 <= sasdate <= 20800) then .;
quit;
我要去哪里错了?
对于初学者来说,我可能无法在此处使用if
语句,但是我不知道还要使用什么。
基本上,我想在数据集的顶部添加一堆行,其中第一个sasdate = 17530,然后非空白(我要添加到ds的数据集)以sasdate = 20800开始。
非常感谢!
答案 0 :(得分:2)
我认为您想要一个case
表达式。例如,这将使您范围内的sasdate
值无效:
create table ds as
select (case when sasdate < 17530 or sasdate > 20800 then sasdate end) as sasdate,
avg(x) as avg_x
from ds1
group by ds1.sasdate;
答案 1 :(得分:1)
SQL没有用于创建新行的内置迭代器或循环语法。您可以右加入一个单独的日期表,该日期表涵盖“范围”内每天的日期,以“填写”“左侧”表的日期。
求平均的函数是MEAN
例如:
data alldays;
do date = 17530 to 20800;
output;
end;
run;
data have;
date = 20800;
x = 1;
do sequence = 1 to 10;
x = sum (x, lag(x));
output;
end;
run;
proc sql;
create table have_ave as
select date, mean (x) as mean_x
from have
group by date;
create table want as
select
coalesce (have_ave.date, alldays.date) as date
, mean_x
from have_ave
right join alldays on have_ave.date = alldays.date
;