【问题标题】:Keep only records in table 1 that correspond to unique value in table 2仅保留表 1 中与表 2 中唯一值相对应的记录
【发布时间】:2019-04-10 21:57:28
【问题描述】:

我正在使用当前版本的 SAS Enterprise Guide。

我有两个表中的数据;表 1 包含帐号列表,表 2 包含每个帐号和每个月的单独记录。帐号是表 1 中的唯一值,但在表 2 中重复,具体取决于帐户活动的月份数。表 2 还包含比表 1 更多的唯一帐号,因此我需要创建一个查询,只保留表 2 中的记录,其中帐号出现在表 1 中。

表 1 是我想要对其进行进一步分析的唯一帐号列表。我想使用该列表从表 2 中更大的列表中过滤掉不需要的帐号。

表 1 是我想要对其进行进一步分析的唯一帐号列表。我想使用该列表从表 2 中更大的列表中过滤掉不需要的帐号。

【问题讨论】:

  • 你尝试了什么?有没有错误?
  • EG UI 促进了此类数据操作。您是否尝试过简单地加入帐号?一到二的关系被称为以下任何一种——1:many、parent:child、master:detail,并且通常由主表中的主键约束和详细表中的外键约束来强制执行。强大的数据存储通常没有没有主记录的详细记录。
  • @Richard 我已经尝试了几种不同的连接类型和过滤器,并且大部分都以表 2 中的所有记录或空白记录结束。问题是我真的不知道查询向导在 EG 中是如何工作的,而我在 google 上看到的所有内容都只是给出了一个非常简单粗略的解释。

标签: datatables sas enterprise-guide


【解决方案1】:

您可以通过不同的方式实现这一目标。我将使用 proc sql :into 子句为 Table1 中的帐号列表创建宏变量:

proc sql;
select distinct account_no into: tab1_act_list separated by "," from table1;
quit;

data table2_temp;
 set table2;
 if account_no in(&tab1_act_list) then delete; /*Or whatever you want to do with these obs*/
run;

或者,您可以使用 Merge、sql-joins。

【讨论】:

    【解决方案2】:

    正常的方式是:

    proc sql noprint;
      create table Rst as 
      select * from Tab2
      where Account in (
        select distinct Account from Tab1
      )
     ;
    quit;
    

    如果 Tab1 和 Tab2 的变量名称相同,则 intersect 语句会更快。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您的表 2 包含多个日期的信息; 因此,如果您需要表 1 中每个帐号的最新数据,您需要:

      1. 从表 2 运行查询生成器,每个日期的最大值为 MAX,例如query builder screenshot

      2. 然后,只需使用 INNER 连接按帐号连接 2 个表 - 它只保留出现在两个表上的记录

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-03
        • 2014-05-26
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多