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

时间:2018-04-05 04:34:06

标签: sql sas left-join proc

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

我想创建一个(左)联接,每个时间点重复391次。这看起来像是一个左联盟,但是,我没有任何加入的身份。

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;

答案 2 :(得分:1)

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

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