有人可以验证我对proc sql union操作的理解吗?我对外部联盟和工会之间差异的解释如下:
Union删除重复的行,而外部联合不删除
Union将覆盖列,而默认情况下,外部联合不会。
那么,联合所有对应和外部联合对应的会有什么区别吗?看起来“ALL”会删除第一个差异,而“CORRESPONDING”会消除第二个差异,但我担心两者之间可能存在额外的差异。我不知道。
答案 0 :(得分:2)
我的理解是OUTER UNION
和UNION ALL
实际上是有效的,如果不相同的话。任何一个都需要CORR
来保证列对齐;使用OUTER UNION
即使列 相同,列也不会堆叠,而UNION ALL
列总是堆栈,即使它们不相同(必须是相同的数据类型或它会错误),并且根本不关注列名。在这两种情况下,添加CORR
都会导致它们堆叠。
以下是一些例子:
不堆叠:
proc sql;
select height, weight from sashelp.class
union all
select weight,height from sashelp.class;
select height, weight from sashelp.class
outer union
select height, weight from sashelp.class;
quit;
堆积:
proc sql;
select height, weight from sashelp.class
union all corr
select weight,height from sashelp.class;
select height, weight from sashelp.class
outer union corr
select height, weight from sashelp.class;
quit;
This SAS doc page很好地展示了这些差异。
答案 1 :(得分:2)
事实证明,实际上存在差异:如何处理仅存在于一个数据集中的列。 Outer Union Corresponding
将显示仅出现在一个数据集中的列,而不是按位置覆盖。 Union All Corresponding
不会显示仅出现在一个数据集中的任何列。
答案 2 :(得分:1)
尝试这些代码,您将清楚看到它们的区别:
测试数据:
data data1;
input id $ expense;
cards;
001 9
001 8
003 7
;
run;
data data2;
input id $ cost;
cards;
001 30
002 80
;
run;
这是所有工会的结果:
proc sql;
select
Id,
sum(Expense) label='COST'
from WORK.data1
group by 1
union all
select
Id,
sum(Cost)
from WORK.data2
group by 1
order by 1,2
;
run;
这是由外部联合更正导致的:
proc sql;
select
Id,
sum(Expense) as Cost
from WORK.data1
group by Id
outer union corr
select
Id,
sum(Cost)
from WORK.data2
group by Id
order by 1,2
;
run;