代码之家  ›  专栏  ›  技术社区  ›  eternity1

SAS-PROC SQL:两个表:每一列的不同值,左连接

  •  2
  • eternity1  · 技术社区  · 6 年前

    我有一个从2000001到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个观察点,只是填满了缺失的值。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Nishant Gupta    6 年前

    您需要笛卡尔积,因为您想要生成日期和时间的所有组合。所以要产生这样的结果,你需要 CROSS 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;
    

    有关的详细信息 交叉连接 请点击以下链接:

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

        2
  •  2
  •   momo1644    6 年前

    您可以执行以下操作之一 Left Join Join 和添加 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
  •  1
  •   Richard    6 年前

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

    考虑这个示例数据生成器。它模拟了在不同的日期以不同的间隔(每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
      ;
    

    Have是

          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