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 | .
我想合并它们,使PostCode1
和PostCode2
中只有一个值。
应该是这样的:
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;
请注意,您的问题没有说明在有多个代码时如何选择哪个代码。这只是使用最大值。
我正在尝试加入一个数据集,该数据集具有多个 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 | .
我想合并它们,使PostCode1
和PostCode2
中只有一个值。
应该是这样的:
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;
请注意,您的问题没有说明在有多个代码时如何选择哪个代码。这只是使用最大值。