2017-02-18 5 views
0

私は次の形式SAS、?

ID BookingDate Releasedate 
1  1/1/11  1/3/14 
2  3/3/12   1/4/17 
. 
. 
. 

内のデータを持っている(IDは文字変数である)

データは、このように上続けています。

は、私は何をしようとしていますが、次のようにループを構築です:

If id(i) = id(i+1) AND 
    BookingDate(i) = Bookingdate(i+1) AND 
    Releasedate(i) NE ReleaseDate(i+1) 
     Then 
     Releasedate(i) = Max(ReleaseDate(i), Releasedate(i+1)) 
    Else 
     Releasedate(i) = Releasedate(i) 

これは私のために= 1になります(行数)

私の構文はここで偽りです。

アレイについて私が読んだことはすべて、列、行単位で動作するようです。

ありがとうございます!

+0

SASは一度に1行ずつ上から下にデータを読み込むので、例のインデックスは必要ありません。ただし、これはあなたの目の前の値を(簡単に)見ることはできませんが、lag()関数(http://support.sas.com/documentation/cdl/ja/)を使用して前の値と比較することができます。 lrdict/64316/HTML/default/viewer.htm#a000212547.htm –

+0

実際に何を計算しようとしていますか?言葉で表現することはできますか?各予約日付の中で最大の割引を見つけたいかのように見えます。 – Tom

答えて

1

以前の値を検索するには、RETAINとLAGを使用します。 テストする機会はありませんでしたが、これが動作することはかなり確かです。あなたはおそらくMAX状態を単純化することができます。

Data want; 
Set have; 

Retain Latest_RDate; 

Prev_id = lag(Id);  
Prev_bdate = lag(bookingdate); 
Prev_rdate = lag(ReleaseDate); 

If Id = (prev_Id + 1) and bookingDate = (prev_bdate + 1) and 
     ReleaseDate ne (Prev_RDate + 1) then Latest_Rdate = max(releasedate, prev_Rdate, Latest_Rdate); 
    Else latest_Rdate = RealeaseDate; 

    Run; 
+0

ありがとうございます。これは私が必要としていた仕事を全くしませんでしたが、私に必要な概要を教えてくれました。 SASを使って作業するのは難しいです... – Redeyes10

+1

彼らは別のプログラミング言語です。 SASのクイックトリックは、一度に1つの行を処理すると考えていますが、Rは通常行列タイプの数学関数を使用していました。しかし、一般的には、同じコードが10万行と1000万行で動作することを意味します。 Rタイプの機能を使用するには、Rと同等のIMLを使用します。 – Reeza