2015-03-12 2 views
2

В моем наборе данных есть несколько позиций по x во многих местах за n-многие недели. Я хочу создать переменную, которая для любого заданного местоположения/недели показывает исходную цену (сначала указанную). Мой набор данных выглядит следующим образом:SAS Создание запаздывания по стартовой цене

data have; 
    input item $ location $ week price; 
cards; 
X NC 1 10 
X NC 2 10 
X NC 3 9.75 
X SC 2 8 
X SC 3 5 
Y NC 1 100 
Y NC 2 75 
Y NC 3 50 
Y NC 4 50 
; 
run; 

Я хочу набор данных, который выглядит следующим образом:

data want; 
    input item $ location $ week price start_price; 
cards; 
X NC 1 10 10 
X NC 2 10 10 
X NC 3 9.75 10 
X SC 2 8 8 
X SC 3 5 8 
Y NC 1 100 100 
Y NC 2 75 100 
Y NC 3 50 100 
Y NC 4 50 100 
; 
run; 

Я знаю, что я, вероятно, может использовать первый. переменная, чтобы сделать это как-то, но не может ее отсортировать. Помогите?

Я пробовал это, но мне кажется, что мне нужно несколько по группам, чтобы получить место, чтобы выйти прямо .... мне нужно объединить элемент/местоположение или есть более элегантный способ сделать это?

data want; 
    set have; 
    by item; 
    if first.item then start_price=price; 
    start_price+0; 
run; 

ответ

3

Я хотел бы использовать retain, чтобы сохранить значение из последней строки. Результат будет таким же, как и оператор суммы с + 0, но я думаю, имеет смысл.

Если я правильно понимаю вопрос, вы хотите, чтобы first.location установил start_price. Просто используйте by item location;, чтобы сделать это.

data want; 
    set have; 
    by item location; 
    retain start_price; 
    if first.location then start_price=price; 
run; 
1

Просто чтобы показать, как вы можете получить 1-ю запись в группе, вот PROC SQL решение, а

data have; 
    input item $ location $ week price; 
cards; 
X NC 1 10 
X NC 2 10 
X NC 3 9.75 
X SC 2 8 
X SC 3 5 
Y NC 1 100 
Y NC 2 75 
Y NC 3 50 
Y NC 4 50 
; 
run; 

Сначала с заявлениями отдельных запросов

proc sql; 
create table START_PRICE as 
select Item, Location, Price as Start_Price 
from HAVE a 
where Week = 
(select min(week) 
from have b 
where a.item=b.item and a.location=b.location) 
order by a.item, a.location; 

Create table WANT as 
Select a.item, a.location, a.week, a.price, b.start_price 
From HAVE a left join START_PRICE b 
    on a.item=b.item and a.location=b.location 
order by a.item, a.location, a.week; 
Quit; 

Тогда, как один запрос

Proc Sql ; 
    Create table WANT2 as 
    Select a.Item, a.Location, a.Week, a.Price, b.Start_Price 
    from HAVE a 
     Left Join 
     (select Item, Location, Price as Start_Price 
     from HAVE a1 
     where Week = 
      (select min(week) from have b1 
      where a1.item=b1.item and a1.location=b1.location) 
     ) b 
     on a.item=b.item and a.location=b.location 
    order by a.item, a.location, a.week; 
Quit;