私は以下のように2つのテーブルを持っています:
表 1、ユーザー一覧表:
Year Month Id Type
2010 3 1 A
2010 5 2 B
2010 10 1 A
2010 12 1 A
表 2 に、ユーザーの昇格履歴を示します。
Promote Date Id
2/20/2010 1
5/20/2010 1 (4/2010 the user got demoted, and after 1 month he got promote again)
これら 2 つのテーブルから、テーブル 1 と同様の結果テーブルを生成する必要がありますが、タイプ A のユーザーが過去 3 か月または特定の日付で 3 か月以上昇格したことを分類する列を追加します。たとえば、結果は次のようになります。
Year Month Id | Duration
2010 3 1 | A < 3 months
2010 10 1 | A > 3 months
2010 12 1 | A > 3 months
一般的な考え方は次のとおりです。
- テーブル 1 の月の列と年の列を 2010 年 3 月のような日付形式に変換する必要があります。
- 上記の日付 (2010 年 2 月) に最も近い昇格日で新しい換算値を減算して、ユーザーが昇格した日数を取得します。
- 彼の昇進期間を分類するために90日と比較してください
私が現在立ち往生している2つの問題があります。
月の列と年の列を月/年の日付形式に変換する最良の方法がわかりません。
テーブル 1 から月/年の列を既に変換していると仮定して、Max 関数を使用してテーブル 2 から最も近い日付を取得します。私の知る限り、max 関数はパフォーマンスが良くないので、max を使用する代わりに他の解決策はありますか? mysql では Limit 1 を使えば簡単に解決できますが、SAS proc-sql は Limit に対応していません。proc-sql に limit に相当するものはありますか? 以下は現在考えているコードです。
PROC SQL;
Create table Result as SELECT table1.Year, table1.Month, table1.Code,
(Case When table1.Type = "B" then "B"
When table1.Type = "A" AND (table1.Date - (Select MAX(table2.Date) From table2 Where table2.Date <= table1.Date AND table2.Id = table1.Id ) < 90) THEN "A < 3 months"
When table1.Type = "A" AND (table1.Date - (Select MAX(table2.Date) From table2 Where table2.Date <= table1.Date AND table2.Id = table1.Id ) >= 90) THEN "A > 3 months"
When table1.Type = "C" then "C"
end) as NewType
From table1
LEFT JOIN
// ....
;
QUIT;
ご覧のとおり、table1 を他のテーブルと結合したままにする必要があるため、サブクエリを使用しますが、これもパフォーマンスが低下しますが、他の方法があるかどうかはわかりません。ヘルプとアドバイスをいただければ幸いです。