【问题标题】:sql - filtering with a condition so there is only one row per datesql - 使用条件过滤,因此每个日期只有一行
【发布时间】:2021-04-19 11:16:21
【问题描述】:

我正在尝试加入一个数据集,该数据集包含多个 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

这当前返回的行数与每个日期的代码一样多。

【问题讨论】:

    标签: sql sas proc-sql


    【解决方案1】:

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

    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;
    

    请注意,当有多个代码时,您的问题并未指定如何选择 which 代码。这只是使用最大值。

    【讨论】:

    • 谢谢!是的,我希望能够按字母顺序将其更改为最大,最小,如果是“BB”代码,则输出该代码,否则无论如何。实际上我只是用 max() 尝试了代码,但它不工作,仍然重复行。可能是因为 max() 查找的是数字而不是字母?
    • @amestrian 。 . .这不能复制data1 中的行,因为group by 保证join 条件最多匹配每个子查询中的一行。
    • 啊,你是对的,发现了一个无法正常工作的错字。 max() 是否按字母顺序获取最高值?或者只是最后一个(在这种情况下大部分是随机的,因为没有时间)?
    • @amestrian 。 . . max() 应用于字符串时,按字母顺序返回最高的一个。
    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多