PROC SQL Условная вставка в использование GT и LT - PullRequest
0 голосов
/ 01 апреля 2019

Мне нужно вставить группу строк, пустые строки, за исключением моей переменной sasdate, которая должна быть результатом этого условия: 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 ]

2 голосов
/ 01 апреля 2019

Я думаю, вы хотите выражение 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 голос
/ 01 апреля 2019

SQL не имеет встроенного итератора или циклического синтаксиса для создания новых строк.Вы можете присоединиться к отдельной таблице дат, охватывающей каждый день в диапазоне, чтобы «заполнить» дни таблицы «слева».

Функция усреднения равна MEAN

* 1005.* Например:
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
  ;
...