【问题标题】:Using the same condition for multiple variables in PROC SQL statement on SAS在 SAS 上的 PROC SQL 语句中对多个变量使用相同的条件
【发布时间】:2015-11-10 09:41:22
【问题描述】:

我使用具有数百列的大表。而且我一直遇到一个问题,即需要检查多个用作标志的列(值为 1 或缺失)是否存在相同的条件。举个简单的例子,

proc sql;
    create table Applications as
    select t1.ApplicantID
         , t1.ApplicationDate
         , t2.Segment
    from Applicants as t1 inner join
         Segmentation as t2 ON t1.ApplicantID = t2.ApplicantID
    where t1.ApplicantID ^= ''
          AND (t1.TR_flag = '') AND (t1.TL_flag = '') 
          AND (t1.RU_flag = '') AND (t1.RP_flag = '') 
          AND (t2.OP_flag = '') AND (t2.OU_flag = '')
          AND (t2.GG_flag = '') AND (t2.GK_flag = '')
    order by t1.ApplicantID
;
quit;

因此,我想知道是否有任何简洁的方法可以一步检查所有标志变量的这种情况。我确实意识到我可以使用数组选项进行循环,但对于这样一个简单的问题来说似乎太复杂了。我也可以将所有变量连接成一个字符串并在新字符串上使用条件,但这种解决方案并不通用。基本上我正在寻找的是类似于 IN 运算符但进入相反方向的东西,例如,

    where t1.ApplicantID ^= ''
          AND (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
               t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = ''

这在视觉上会更容易,并且在最佳情况下运行得更快。

【问题讨论】:

  • 将示例中的 AND 替换为 AND COALESCE

标签: sas proc-sql


【解决方案1】:

您可以使用CMISS,以及您需要缺少的参数数量:

CMISS (t1.TR_flag, t1.TL_flag, t1.RU_flag, t1.RP_flag,
               t2.OP_flag, t2.OU_flag, t2.GG_flag, t2.GK_flag) = 8

对于特定的值,并且不干扰连接:

(t1.TR_flag = t1.TL_flag = t1.RU_flag = t1.RP_flag = '1'
AND
t2.OP_flag = t2.OU_flag = t2.GG_flag = t2.GK_flag = '1')

不过,我看不出它运行得更快。

【讨论】:

  • 解决我的具体问题的好方法,谢谢。但是,它不适用于处理 1 和 0 标志或任何其他非缺失值的情况。对此有什么想法吗?
  • 对于 0 和 1,您可以根据需要使用 MAX 或 MIN。
  • 只有当它们是 0 和 1(数字),而不是 '0' 和 '1'(字符)时,否则你会看到:ERROR: Function MIN requires a numeric expression as argument
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2021-03-21
相关资源
最近更新 更多