【问题标题】:SAS - PROC SQL: two tables: each one column distinct value, left joinSAS - PROC SQL:两个表:每列不同的值,左连接
【发布时间】:2018-04-05 04:34:05
【问题描述】:

我有一张表格,其中包含从 20000101 到 20001231 的不同日期 YYYYMMDD,还有一张从 09:30:00 到 16:00:00 有不同时间点 (HH:MM:SS) 的表格。

我想创建一个(左)连接,在该连接中,每个时间点每天都会重复 391 次。在我看来,这就像一个左连接,但是,我没有任何 id 可以加入。

date          time
20000101    09:30:00
20000101    09:31:00
20000101    ...
20000101    ...
20000101    15:59:00
20000101    16:00:00
20000102    09:30:00
20000102    ...
20000102    16:00:00

各自的代码会是什么样子(如果没有明确的公共主键可以加入)?

PROC SQL;
   SELECT DISTINCT a.date, b.time
   FROM table_1 a, table_1 b (both information are in the same table)
   ;
QUIT;

就像背景一样:有些天“更短”/少于 391 个观察点。但是,我想确保每天有 391 个观察点,只是用缺失值填充。

【问题讨论】:

    标签: sql sas left-join proc


    【解决方案1】:

    您需要笛卡尔积,因为您想生成日期和时间的所有组合。因此,要产生这样的结果,您需要CROSS JOIN,其中您不必提供任何 JOIN 条件。

    试试下面的查询:

    PROC SQL;
       SELECT a.date, b.time
       FROM table_1 a
       CROSS JOIN
       table_1 b
       GROUP BY a.date, b.time 
       ;
    QUIT;
    

    PROC SQL;
           SELECT a.date, b.time
           FROM (SELECT date FROM table_1) a
           CROSS JOIN
           (SELECT time FROM table_1) b
           GROUP BY a.date, b.time 
           ;
    QUIT;
    

    有关CROSS JOIN的更多信息,请点击以下链接:

    http://support.sas.com/documentation/cdl/en/fedsqlref/67364/HTML/default/viewer.htm#p1q7agzgxs9ik5n1p7k3sdft0u9u.htm

    【讨论】:

      【解决方案2】:

      您可以使用Left JoinJoin 并添加Where 1=1 这将为您创建笛卡尔积:

      代码:

      proc sql;
       create table want as
        select t1.date, t2.time
        from t1 left join t2 on 1=1
        order by date, time;
      quit;
      

      【讨论】:

        【解决方案3】:

        为了显示每个日期的所有观测时间(所有日期),以及维护原始卫星信息,我将使用组合列的自反交叉连接作为自反左连接的基础。

        考虑这个示例数据生成器。它模拟了在不同日期以不同时间间隔(每 10 或 20 分钟)收集数据的情况。

        data have;
          do i = 1 to 5;
            date = '01-apr-2018'd + (i-1);
            do j = 0 to 4;
              time = '12:00't + (mod(i,2)+1) * 600 * j;  * every other day sample at 1o or 20 minute interval;
              x = ceil ( 25 * ranuni(123) );
              OUTPUT;
            end;
          end;
          format date yymmdd10. time time8.;
          keep date time x;
        run;
        

        SQl 用于交叉连接不同的日期和时间,然后将原始数据留在交叉连接中。

        proc sql;
          create table cross_as_left_basis 
          as
          select 
            cross.date
          , cross.time
          , have.x
          from
            ( select distinct dates.date, times.time
              from       have as dates
              cross join have as times
            ) as
            cross
          left join 
            have 
          on 
            cross.date = have.date
            and cross.time = have.time
          ;
        

        有是

              date        time     x
        
        2018-04-01    12:00:00    19
                      12:20:00     9
                      12:40:00     5
                      13:00:00    23
                      13:20:00     9
        
        2018-04-02    12:00:00     6
                      12:10:00    20
                      12:20:00    10
                      12:30:00     4
                      12:40:00     5
        
        2018-04-03    12:00:00    20
                      12:20:00    11
                      12:40:00    25
                      13:00:00     7
                      13:20:00    18
        
        2018-04-04    12:00:00    14
                      12:10:00    14
                      12:20:00    22
                      12:30:00     4
                      12:40:00    22
        
        2018-04-05    12:00:00    17
                      12:20:00    20
                      12:40:00    18
                      13:00:00     9
                      13:20:00    14
        

        连接结果是

              date        time     x
        
        2018-04-01    12:00:00    19
                      12:10:00     .
                      12:20:00     9
                      12:30:00     .
                      12:40:00     5
                      13:00:00    23
                      13:20:00     9
        
        2018-04-02    12:00:00     6
                      12:10:00    20
                      12:20:00    10
                      12:30:00     4
                      12:40:00     5
                      13:00:00     .
                      13:20:00     .
        
        2018-04-03    12:00:00    20
                      12:10:00     .
                      12:20:00    11
                      12:30:00     .
                      12:40:00    25
                      13:00:00     7
                      13:20:00    18
        
        2018-04-04    12:00:00    14
                      12:10:00    14
                      12:20:00    22
                      12:30:00     4
                      12:40:00    22
                      13:00:00     .
                      13:20:00     .
        
        2018-04-05    12:00:00    17
                      12:10:00     .
                      12:20:00    20
                      12:30:00     .
                      12:40:00    18
                      13:00:00     9
                      13:20:00    14
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多