在sas中基于第二个数据集相交一个数据集

在sas中基于第二个数据集相交一个数据集,sas,Sas,我有一个名为“primary_data”的数据集,如下所示: Obs Id Month Name Salary 1 10006 JAN1926 name1 3273 2 10006 FEB1926 name1 7143 3 10007 JAN1926 name2 4274 4 10008 JAN1926 name3 2591 5 10008 FEB1926 name3 2394 6 10009 JAN1926

我有一个名为“primary_data”的数据集,如下所示:

Obs  Id     Month   Name    Salary
1   10006   JAN1926 name1   3273
2   10006   FEB1926 name1   7143
3   10007   JAN1926 name2   4274
4   10008   JAN1926 name3   2591
5   10008   FEB1926 name3   2394
6   10009   JAN1926 name4   4416
.
.
Obs Id
1   10006
2   10008
.
.
我还有另一个名为“选择”的数据集,看起来像这样:

Obs  Id     Month   Name    Salary
1   10006   JAN1926 name1   3273
2   10006   FEB1926 name1   7143
3   10007   JAN1926 name2   4274
4   10008   JAN1926 name3   2591
5   10008   FEB1926 name3   2394
6   10009   JAN1926 name4   4416
.
.
Obs Id
1   10006
2   10008
.
.
注意:Id在“选择”数据集中是唯一的

我需要获取主要_数据的子集,其中Id取自“选择”数据集。我尝试了合并,但是我得到了整个主\u数据作为我的输出

data merged_data;
    merge primary_data selection;
    by Id;
run;
在上面的示例中,我希望merged_data具有与Ids:10006和10008对应的条目,而不是来自Ids 10007和10009。也就是说,合并的_数据应如下所示:

Obs  Id     Month   Name    Salary
1   10006   JAN1926 name1   3273
2   10006   FEB1926 name1   7143
3   10008   JAN1926 name3   2591
4   10008   FEB1926 name3   2394
.
.

我不明白,我做错了什么。

如果要使用datastep进行合并,则需要使用表中的
选项
,因为要使用
内部联接

e、 g.在
in2变量
中,如果在输出记录中使用了
选择表
中的记录,则有信息:

data merged_data;
    merge primary_data(in=in1) selection(in=in2);
    by Id;

    if in1 and in2; /* inner join */
run;

如果要使用datastep进行合并,则需要使用表中的
选项
,因为要使用
内部联接

e、 g.在
in2变量
中,如果在输出记录中使用了
选择表
中的记录,则有信息:

data merged_data;
    merge primary_data(in=in1) selection(in=in2);
    by Id;

    if in1 and in2; /* inner join */
run;

谢谢罗伯特,这正是我需要的:)。我不知道内部联接。这个方法很好,但我认为你不应该使用
in1
in2
,而应该使用描述性名称。@Joe我认为这取决于具体情况。在我曾经工作过的一家公司,每一张桌子都有三个字母的首字母缩略词,这些词都是标准化的,非常有效。在我现在工作的地方,这是不可能的,因为我们来自很多不同的系统。相反,我们只使用
a
b
c
,等等。当人们尝试使用描述性名称时,实际上情况会更糟,因为您仍然需要交叉引用别名来检查实际的表名(有时使用的别名会产生误导)。我们甚至在我们的连接别名上使用了
a
b
c
,这也很好。我很想看到一个特定的场景,在这个场景中,您不能拥有至少像缩写表名这样的特定内容。如果要执行宏,可以使用宏变量名。我从未见过a/b/c是最佳解决方案的案例,但我愿意看到……谢谢罗伯特,这正是我所需要的:)。我不知道内部联接。这个方法很好,但我认为你不应该使用
in1
in2
,而应该使用描述性名称。@Joe我认为这取决于具体情况。在我曾经工作过的一家公司,每一张桌子都有三个字母的首字母缩略词,这些词都是标准化的,非常有效。在我现在工作的地方,这是不可能的,因为我们来自很多不同的系统。相反,我们只使用
a
b
c
,等等。当人们尝试使用描述性名称时,实际上情况会更糟,因为您仍然需要交叉引用别名来检查实际的表名(有时使用的别名会产生误导)。我们甚至在我们的连接别名上使用了
a
b
c
,这也很好。我很想看到一个特定的场景,在这个场景中,您不能拥有至少像缩写表名这样的特定内容。如果要执行宏,可以使用宏变量名。我从未见过a/b/c是最佳解决方案的案例,但我愿意看到。。。