2015-04-02 4 views
0

У меня есть два набора данных, которые выглядят следующим образом:декартовой Регистрация SAS Proc SQL

data sales; 
    format week date9.; 
    input store $ week date9. sales; 
cards; 
A 01JAN2014 200 
A 08JAN2014 500 
A 22JAN2014 200 
B 01JAN2014 100 
B 08JAN2014 200 
B 15JAN2014 200 
; 
run; 

data dates; 
    format week date9.; 
    input week date9.; 
cards; 
01JAN2014 
08JAN2014 
15JAN2014 
22JAN2014 
29JAN2014 
; 
run; 

Это небольшие примеры очень больших таблиц в базе данных. Я хочу присоединиться к ним с помощью шага proc sql, так что все даты присутствуют для каждого местоположения (с отсутствующими значениями, если нет продаж). Я создаю декартовое соединение магазинов и недель для получения желаемого результата, но этот метод оказался крайне неэффективным, когда я пытаюсь запросить большие объемы данных. Я знаю, что есть лучший способ сделать это, но он не может его получить. Ниже моя попытка ... уточнить, набор данных full_sales - желаемый результат, мне просто нужен более эффективный способ сделать это. Благодарю.

proc sql; 
    create table cartesian as 
    select distinct sales.store, dates.week 
    from sales, dates 
    order by 1,2; 
quit; 

proc sql; 
    create table full_sales as 
    select cartesian.store, 
       cartesian.week, 
       sales.sales 
    from cartesian 
    left join sales 
     on cartesian.store=sales.store and 
     cartesian.week=sales.week 
    order by 1,2 
    ; 
quit; 

ответ

2

Я хотел бы подойти к этому как:

proc sql; 
    create table full_sales as 
    select s.store, w.week, ssa.sales 
    from (select distinct store from sales) s cross join 
     dates w left join 
     sales sa 
     on s.store = sa.store and 
      w.week = sa.week 
    order by 1,2 
    ; 
quit; 

Это не требует вспомогательной таблицы cartesian, что может быть быстрее. Индекс на sales(store, week) определенно ускорит запрос.

+0

Я только что заметил, что книга «Data Mining Techniques», которая сидела на моем столе в течение нескольких лет, имеет знакомое имя как соавтор! – Longfish

+0

Спасибо, Гордон. Это делает трюк! – pyll

2

Я рекомендую альтернативный подход, который предполагает создание формата из набора данных DATES, затем используя completetypes и preloadfmt в proc summary для вывода всех наблюдений.

Это делает предположение, что все необходимые даты появятся в наборе данных DATES (т. Е. В SALES нет дат, которые не отображаются в DATES). Это может быть более быстрый подход, чем использование proc sql.

Я добавил шаг в конец, чтобы изменить формат на стандарт date9., так как вы могли столкнуться с проблемами с открытием набора данных с заданным пользователем wk_fmt..

data sales; 
    format week date9.; 
    input store $ week :date9. sales; 
cards; 
A 01JAN2014 200 
A 08JAN2014 500 
A 22JAN2014 200 
B 01JAN2014 100 
B 08JAN2014 200 
B 15JAN2014 200 
; 
run; 

data dates; 
    format week date9.; 
    input week :date9.; 
cards; 
01JAN2014 
08JAN2014 
15JAN2014 
22JAN2014 
29JAN2014 
; 
run; 

/* create dataset with format details */ 
data week_format; 
set dates; 
rename week = start; 
retain fmtname 'wk_fmt' type 'N'; 
label = vvalue(week); 
run; 

/* load format from previous dataset */ 
proc format cntlin=week_format; 
run; 

/* create table of all combinations of store and dates */ 
proc summary data = sales nway completetypes; 
class store; 
class week/preloadfmt; 
format week wk_fmt.; 
id sales; 
output out=want (drop=_:); 
run; 

/* change format back to date9. */ 
proc datasets lib=work nodetails nolist; 
modify want; 
format week date9.; 
quit; 
+0

Это очень интересное использование резюме proc. Я никогда не думал использовать его так раньше. Я выбрал ответ Гордона как лучший, потому что он более условный и, вероятно, более широко применимый, но это очень хорошее решение. Спасибо за помощь. – pyll

+0

@pyll Полностью согласен с вами. Считаемость часто требует предпочтения по скорости, правильно. Мне нравится демонстрировать, что иногда вы можете использовать процедуры SAS необычными способами для достижения цели, эти методы могут помочь в других ситуациях. – Longfish