使用GT和LT将PROC SQL条件插入

时间:2019-04-01 20:15:50

标签: sql insert sas proc

除了我的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开始。

非常感谢!

2 个答案:

答案 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
  ;