Дублирующиеся строки, основанные на датах от и до - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть таблица типа (код в SAS SQL, но я могу преобразовать ответ из движка SQLServer, так как у меня есть небольшой опыт в этом):

proc sql;
   create table work.temp1
       (date_from num informat=date7. format=date7.,
        date_to num informat=date7.   format=date7.,
        some_number num);

insert into work.temp1
    values('15MAY2018'd,'26JUL18'd, 10);
QUIT;

результат:

enter image description here

, и я хочу преобразовать его в (с некоторым умным соединением и, возможно, некоторой временной таблицей с датами и месяцами) в:

proc sql;
   create table work.temp2
       (date_from num informat=date7. format=date7.,
        date_to num informat=date7.   format=date7.,
        some_number num);

insert into work.temp2
    values('15MAY2018'd,'31MAY18'd, 10)
    values('1JUN2018'd,'30JUN18'd, 10)
    values('1JUL2018'd,'26JUL18'd, 10);
QUIT;

результат:

enter image description here

Все остальные столбцы должны быть продублированы.Даты от и до всегда указаны в одной календарной дате, но каждая строка может быть в разные годы (2016-2020).

[РЕДАКТИРОВАТЬ]:

Том решение выглядит хорошоно прежде чем использовать, я пытаюсь разработать решение SQL.

Я добавил таблицу «календарь» в свою базу данных, и она выглядит так: name: work.calendar enter image description here

Теперь объединение, о котором я думаюбыло бы что-то вроде:

SELECT t1.* 
FROM work.temp1 t1 INNER JOIN 
     work.calendar t2 ON t1.date_from >= t2.month_FROM AND t1.date_to <= month_TO

Но это, очевидно, не работает.

1 Ответ

0 голосов
/ 12 сентября 2018

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

Итак, начнем с создания тестовых данных.

data temp1;
  date_from='15MAY2018'd;
  date_to='26JUL18'd;
  some_number= 10;
  format date_: date9. ;
run;

Функция intck() может использоваться для определения количества интервалов. А функция intnx() может использоваться для поиска начала / конца месяца. Вы также можете добавить строки кода, чтобы переименовать новые переменные и удалить старые переменные и счетчик цикла.

data want ;
  set temp1 ;
  do i=0 to intck('month',date_from,date_to);
    from = max(intnx('month',date_from,i,'b'),date_from);
    to = min(intnx('month',date_from,i,'e'),date_to);
    output;
  end;
  format from to date9.;
  rename from=date_from to=date_to;
  drop date_from date_to i ;
run;

enter image description here

...