如何在 SAS 中为每次迭代执行多个 case when 语句?

How to execute multiple case when statements for each iteration in SAS?

我正在使用 proc sql,并使用多个 case when 语句来添加带有 0 或 1 的列(如果满足条件)。现在这是一个很大的瓶颈,因为它必须为每个 case when 语句扫描每个 id。所以我试图找出一种方法来以某种方式嵌套 case 语句来执行每次迭代,而不是必须对所有 case 语句进行迭代。

这是我的代码示例,现在耗时过长。

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
    )

下面的查询将比您发布的查询运行得更快,因为输入 table 不能完全访问以检索结果。试试 运行 这个查询,看看它是如何执行的。

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
;

由于您使用的是 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 获得重复记录。