gpt4 book ai didi

sql - SAS 中合并的工作(使用 IN=)

转载 作者:行者123 更新时间:2023-12-03 03:29:05 29 4
gpt4 key购买 nike

我有两个数据集 data1 和 data2

data data1; 
input sn id $;
datalines;
1 a
2 a
3 a
;
run;

data data2;
input id $ sales x $;
datalines;
a 10 x
a 20 y
a 30 z
a 40 q
;
run;

我从下面的代码中合并它们:

data join;
merge data1(in=a) data2(in=b);
by id;
if a and b;
run;

结果:(我期待的是内部联接结果,但事实并非如此)

1   a   10  x
2 a 20 y
2 a 30 z
2 a 40 w

来自 proc sql 内部联接的结果。

proc sql;
select data1.id,sn,sales,x from data2 inner join data1 on data1.hh_id;
quit;

结果:(正如内部联接所预期的那样)

a  1  10  x
a 1 20 y
a 1 30 z
a 1 40 w
a 2 10 x
a 2 20 y
a 2 30 z
a 2 40 w
b 3 10 x
b 3 20 y
b 3 30 z
b 3 40 w

我想了解 SAS 中 merge 语句与 In=概念逐步工作原理并证明上述结果。

PS:我已阅读this ,它说

An obvious use for these variables is to control what kind of 'merge' will occur, using if statements. For example, if ThisRecordIsFromYourData and ThisRecordIsFromOtherData; will make SAS only include rows that match on the by variables from both input data sets (like an inner join).

我猜,(如内部联接)并非总是如此。

最佳答案

基本上,这是由于 SAS 数据步骤和 SQL 处理各自的联接/合并的方式不同造成的。

SQL 为每个可能的键组合创建一个单独的记录。这是笛卡尔积(在关键级别)。

但是,SAS 数据步骤的合并过程非常不同。 MERGE 实际上只不过是 SET 的一个特例。它仍然迭代地处理行,一次处理一行 - 它永远不会返回,并且一次不会同时处理来自 PDV 中任何数据集的多于一行。因此,它无法在其正常过程中创建笛卡尔积 - 这将需要随机访问,而 SAS 数据步骤通常不会执行此操作。

它的作用:

For each unique BY value
Take the next record from the left side dataset, if one exists with that BY value
Take the next record from the right side dataset, if one exists with that BY value
Output a row
Continue until both datasets are exhausted for that BY value

对于在任一侧(或两侧)的每个值生成唯一记录的 BY 值,它实际上与 SQL 相同。但是,如果 BY 值在两侧都产生重复项,您将得到那里的结果:并排合并,如果一个在另一个之前用完,则来自较短数据​​集最后一行的值(对于该数据集)值)或多或少被复制下来。 (它们实际上是保留的,因此如果您用更改覆盖它们,它们将不会在较长数据集中的新记录上重置)。

因此,如果 left 有 3 条记录,而 right 有 4 条键值 a 记录,如您的示例所示,那么您将获得数据来自以下记录(假设您之后不更改数据):

left  right
1 1
2 2
3 3
3 4

关于sql - SAS 中合并的工作(使用 IN=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33612326/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com