在sas中基于第二个数据集相交一个数据集
我有一个名为“primary_data”的数据集,如下所示:在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
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是最佳解决方案的案例,但我愿意看到。。。