当前位置: 首页 > 面试题库 >

SAS中的合并工作(IN =)

杜绍元
2023-03-14
问题内容

我有两个datasetdata1和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语句的 概念STEP BY STEP的 工作,并证明上述结果。 merge``In=

PS:我已经读过了,上面写着

这些变量的一个明显用途是使用if语句来控制将发生哪种“合并”。例如,如果ThisRecordIsFromYourData和ThisRecordIsFromOtherData;
将使SAS仅包括与两个输入数据集中的byhtml" target="_blank">变量匹配的行(例如内部联接)。

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


问题答案:

基本上,这是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


 类似资料:
  • 所以我有 1500 个 Excel 工作簿,每个工作簿都有 10 张结构完全相同的工作表。我尝试将多个Excel工作簿合并到一个文件中,并使用以下代码成功: 谢谢,努尔贝克

  • 我在Jasper Report中的excel导出时遇到问题。我的报告的输出excel文件有不需要的合并单元格,具体取决于我为每个报告使用的报告模板。我在第一个excel表中显示报告模板,在第二个excel表中显示“列标题”和“数据”。我试图做的是忽略第二个表中的合并单元格。我使用 属性创建第二张图纸。 我不允许更改模板,所以我应该找到一种方法来忽略第二张表中的合并单元格,这是我的excel文件的屏

  • 我正在寻找一种方法来合并特定行值从多个电子表格时,某些验证得到满足。 场景:我目前有Sheet1、Sheet2、Sheet3,我想要的是在满足验证时将Sheet2和Sheet3中的数据合并到Sheet1中。 表1: 第2张: 第3张: 基于上述示例,我在sheet1单元格A2中使用了此函数 因此,如果列E“类型”是“新玩家”(验证),它会自动添加表2中的行值。 我想要的是,如果类型为“New Pl

  • 我想问一下,是否有任何可能的方法来设置一个简单版本的应用程序脚本,类似于下面的附加组件。 https://chrome.google.com/webstore/detail/merge-sheets/gdmgbiccnalapanbededmeiadjfbfhkl?utm_source=ablebits 基本上,我有工作表1和工作表3,两个工作表都有一个公共键列,每个单元格中都有特定的值,我想用该

  • 我正在尝试实现一个不能正常工作的mergesort算法。合并排序的工作方式如下: i、 将未排序的列表划分为n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序)。 ii.重复合并子列表以产生新排序的子列表,直到只剩下1个子列表。这将是已排序的列表。下面提供了实现。 最初,递归调用此方法,直到只有一个元素。 这是提供的合并方法。 这里的问题是什么? 输入是输出是

  • 问题内容: 我创建了一个简单的演示: 问题在于的一部分根本没有运行。 如果我只使用两个参数并且等于provider ,它将运行。 如何使方法工作? 问题答案: 首先,由于没有要合并的内容,因此不需要在非并行流中执行合并器。 其次,您的问题源于使用和。应该使用累加器通过将第二个参数与第一个参数结合来修改第一个参数,但是由于Java中的字符串是不可变的,因此您的代码不会产生任何结果。 将创建一个新字符