2016-10-25 11 views
0

私はproc sqlを使用しています。条件が満たされている場合は、複数のcase when文を使用して、0または1の列を追加します。ステートメントがどのような場合に各IDをスキャンする必要があるので、今は大きなボトルネックです。だから私は、すべてのcase文を繰り返し処理するのではなく、各繰り返しを実行するためにcase文を何とか入れ子にする方法を見つけ出そうとしています。SASの各繰り返しのステートメントが複数のケースを実行する方法は?

これは私のコードの例ですが、今は長すぎます。

SELECT *, 
     CASE WHEN loannumber IN (
      SELECT loannumber FROM PREPAY_LOAN_IDS 
     ) THEN 1 
     ELSE 0 END AS PREPAY_FLAG, 

     CASE WHEN loannumber IN (
      SELECT loannumber FROM DPD_30_IDS 
     ) THEN 1  
     ELSE 0 END AS DPD_30_FLAG, 

     CASE WHEN loannumber IN (
      SELECT loannumber FROM DPD_60_IDS 
     ) THEN 1 
     ELSE 0 END AS DPD_60_FLAG, 

     CASE WHEN loannumber IN (
      SELECT loannumber FROM DPD_90_IDS 
     ) THEN 1  
     ELSE 0 END AS DPD_90_FLAG, 

     CASE WHEN loannumber IN (
      SELECT loannumber FROM DPD_120_IDS 
     ) THEN 1 
     ELSE 0 END AS DPD_120_FLAG, 

     CASE WHEN loannumber IN (
      SELECT loannumber FROM FORECLOSURE_IDS 
     ) THEN 1  
     ELSE 0 END AS FORECLOSURE_FLAG 

FROM(
    SELECT * 
    FROM MORTGAGES 
    ) 
+0

なぜあなたは 'FROM MORTGAGES'ではなく' FROM'ステートメントでサブクエリを使用していますか? – EMUEVIL

+0

おそらく、 'loannumber'のすべてのテーブルを' LEFT JOIN'するのが速く、それが速くなるかどうかを確かめるでしょう。 – EMUEVIL

+0

これらのテーブルのいずれかに重複した 'loannumber'値が含まれていますか? – user667489

答えて

1

以下のクエリは、入力テーブルが結果を取得するために完全にアクセスできないため、投稿したクエリよりも速く動作します。このクエリを実行して、そのクエリの実行方法を確認してください。

SELECT M.*, 
     CASE WHEN PLI.loannumber IS NOT NULL THEN 1 
     ELSE 0 END AS PREPAY_FLAG, 
     CASE WHEN D3I.loannumber IS NOT NULL THEN 1  
     ELSE 0 END AS DPD_30_FLAG, 
     CASE WHEN D6I.loannumber IS NOT NULL THEN 1 
     ELSE 0 END AS DPD_60_FLAG, 
     CASE WHEN D9I.loannumber IS NOT NULL THEN 1  
     ELSE 0 END AS DPD_90_FLAG, 
     CASE WHEN D12I.loannumber IS NOT NULL THEN 1 
     ELSE 0 END AS DPD_120_FLAG, 
     CASE WHEN FCI.loannumber IS NOT NULL THEN 1  
     ELSE 0 END AS FORECLOSURE_FLAG 
    FROM MORTGAGES M 
LEFT JOIN 
     PREPAY_LOAN_IDS PLI 
    ON M.loannumber = PLI.loannumber 
LEFT JOIN 
     DPD_30_IDS D3I 
    ON M.loannumber = D3I.loannumber 
LEFT JOIN 
     DPD_30_IDS D6I 
    ON M.loannumber = D6I.loannumber 
LEFT JOIN 
     DPD_90_IDS D9I 
    ON M.loannumber = D9I.loannumber 
LEFT JOIN 
     DPD_90_IDS D12I 
    ON M.loannumber = D12I.loannumber 
LEFT JOIN 
     FORECLOSURE_IDS FCI 
    ON M.loannumber = FCI.loannumber 
; 
+0

loannumberが他のテーブルで一意でない場合は、列が重複します。 – EMUEVIL

0

あなたはSASを使用しているので、ここではあなたのデータセットのそれぞれは、既にいずれかの方法でソートしたりloannumberにインデックスを持っていると仮定して、データのステップの代替です:

data want; 
    merge MORTGAGES(in = Mortgages) 
     PREPAY_LOAN_IDS(in = PLIDs keep = loannumber) 
     /*etc*/ 
     ; 
    by loannumber; 
    if Mortgages; 
    PREPAY_FLAG = PLIDs; 
    /*etc*/ 
run; 

N.B.他のテーブルに重複がある場合は、MORTGAGESから重複したレコードを取得します。

関連する問題