【问题标题】:Merging 2 data seta in what I understand is one-to many merge SAS在我理解的情况下合并 2 个数据集是一对多合并 SAS
【发布时间】:2026-01-02 06:10:02
【问题描述】:

我有 2 个数据集:

|ColA|ColB
|date1|1
|date2|2
|date3|3

|cola|colb|colc.....|colz|
|blaa|blaa|blaaaaaaa|date1
|blab|blab|blaaaaaab|date1
|blac|blac|blaaaaaac|date1
|blaa|blaa|blaaaaaaa|date2
|blag|blag|blaaaaaag|date3

我想要的是每个日期的数字等于第一个表的数字

|cola|colb|colc.....|colz |ColZ+1
|blaa|blaa|blaaaaaaa|date1|1
|blab|blab|blaaaaaab|date1|1
|blac|blac|blaaaaaac|date1|1
|blaa|blaa|blaaaaaaa|date2|2
|blag|blag|blaaaaaag|date3|3

我尝试过的:

 proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum 
from merged_dpd_raw_2602 a
left join work.date_transform b
on datepart(a.reporting_date) = datepart(b.DATE)
;quit;

它只在上个月添加一个数字。所有其他月份都有一个“。” .

proc sort data=date_transform;
by formatted_date;
run;
proc sort data=merged_dpd_raw_2602;
by formatted_date;
run;

data merged_dpd_raw_2602_B;
 merge date_transform(in=A) merged_dpd_raw_2602(in=B);
 by  formatted_date;
 if A=1 and B=1;

 run;

正确合并,但我以某种方式丢失了 310k 数据条目。

【问题讨论】:

  • “多对一”是您真正想要的词,因为它的价值(顺序很重要)。

标签: merge sas bigdata


【解决方案1】:

我怀疑您不是在尝试合并实际日期而是一个月,因此您最有可能使用格式化值。因此,请将您的日期设置为月初或将它们转换为 YYMM 以进行合并。

proc sql;
create table merged_dpd_raw_2602_B
as select a.*, b.delnum 
from merged_dpd_raw_2602 a
left join work.date_transform b
on intnx('month', datepart(a.reporting_date), 0, 'b') = intnx('month', datepart(b.DATE), 0, 'b')
;quit;

【讨论】:

  • 警告:函数 DATEPART 最多需要 1 个参数。多余的将被忽略。错误:函数 INTNX 至少需要 3 个参数。
  • 忘记了 datepart 周围的右括号。现已修复。
  • 您能解释一下为什么您的版本可以运行,而我的版本失败了吗? @reeza
  • 因为 SAS 在您的完整日期 (2021-04-26) 加入,所以如果月/年的日期不匹配,它不会加入,我的加入只有月份和年份(例如 2021-04-01),日期部分已标准化为 01。
【解决方案2】:

所以我调试的方式如下。

使用数据步骤合并,它能够处理多对一的罚款。

data merged_dpd_raw_2602_B nomatch;
 merge date_transform(in=__date) merged_dpd_raw_2602(in=__raw);
 by  formatted_date;
 if __date and __raw then output merged_dbd_raw_2602_b;
 else do;
    invar = ifn(__date,'in date','in raw ');
    output nomatch;
 end;
run;

这会显示不匹配的记录。重要的是,数据步骤合并的工作方式可能会以正确的顺序向您显示记录(但可能不是,这取决于合并不起作用的原因)。

您可能不太关心的“日期”记录,它可能只是您关心的“原始”变量 - 假设我了解哪一个是记录最多的变量。查看不匹配的记录,然后尝试找出它们应该匹配的内容(记录可能从“日期”开始,但它可能不是,如果“日期”记录匹配不同的“原始”记录)。

这可以让您准确了解数据中的哪些问题。

【讨论】:

    最近更新 更多