sql - 使用条件过滤,因此每个日期只有一行

sql - filtering with a condition so there is only one row per date

我正在尝试加入一个数据集,该数据集具有多个 ID 的多个日期,甚至同一日期的多个行,以及一个具有多个 ID 的多个日期的数据集。

我们称这个为Data1

ID | Date       | PostDate1  | PostDate2 
01 | 01/01/2020 | 02/01/2020 | 03/01/2020
01 | 06/01/2020 | 07/01/2020 | 08/01/2020
02 | 02/01/2020 | 03/01/2020 | 04/01/2020
02 | 03/01/2020 | 04/01/2020 | 05/01/2020

这是Data2

ID | Date       | Code
01 | 01/01/2020 | AA
01 | 01/01/2020 | .
01 | 02/01/2020 | BB
01 | 02/01/2020 | AA
01 | 04/01/2020 | BB
01 | 07/01/2020 | .
01 | 07/01/2020 | BB
01 | 07/01/2020 | . 
01 | 08/01/2020 | AA
02 | 03/01/2020 | .
02 | 03/01/2020 | AA
02 | 04/01/2020 | AA
02 | 04/01/2020 | BB
03 | 04/01/2020 | . 

我想合并它们,使PostCode1PostCode2中只有一个值。 应该是这样的:

ID | Date       | PostDate1  | PostDate2  | PostCode1 | Postcode2 
01 | 01/01/2020 | 02/01/2020 | 03/01/2020 | BB        | .
01 | 06/01/2020 | 07/01/2020 | 08/01/2020 | BB        | AA
02 | 02/01/2020 | 03/01/2020 | 04/01/2020 | AA        | BB
02 | 03/01/2020 | 04/01/2020 | 05/01/2020 | BB        | .

不过这只是一个例子,我不确定条件,也就是我不确定是否要选择:

-字母顺序第一个

-按字母顺序最后一个

-如果没有丢失则任意

-一个特定的,如果它在那个日期存在,如果不存在那么任何

能否创建一个代码,我可以根据我想申请的条件轻松更改其中的一部分?

我目前使用的加入代码是:

proc sql;
create table new as
select distinct a.*
, data2_1.code as PostCode1
, data2_2.code as PostCode2

from data1 a 
left join data2 data2_1
on a.id=data2.id and a.postdate1=data2.date

from data1 a 
left join data2 data2_2
on a.id=data2.id and a.postdate2=data2.date

目前 returns 有多少行,每个日期都有代码。

您的查询在语法上不正确。我认为你想要的逻辑很简单:

select a.*, data2_1.code as PostCode1, data2_2.code as PostCode2
from data1 a left join
     (select d.id, d.date, max(code) as code
      from data2 d
      group by d.id, d.date
     ) data2_1
     on a.id = data2.id and a.postdate1 = data2.date left join
     (select d.id, d.date, max(code) as code
      from data2 d
      group by d.id, d.date
     ) data2_2
     on a.id = data2.id and a.postdate2 = data2.date;

请注意,您的问题没有说明在有多个代码时如何选择哪个代码。这只是使用最大值。