SAS - PROC SQL:两个表:每列不同的值,左连接
SAS - PROC SQL: two tables: each one column distinct value, left join
我有一个 table 具有从 20000101 到 20001231 的不同日期 YYYYMMDD 和一个具有从 09:30:00 到 [=23= 的不同时间点 (HH:MM:SS) 的 table ].
我想创建一个(左)连接,每天重复 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;
作为背景:有"shorter"/少于391个观察点的日子。但是,我想确保每天有391个观察点,只是用缺失值填充。
您需要笛卡尔积,因为您想要生成日期和时间的所有组合。因此,要产生这样的结果,您需要 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
的更多信息,请遵循以下 link:
您可以执行 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;
为了显示每个日期的所有观察时间(所有日期),以及维护原始卫星信息,我将使用组合列的自反交叉连接作为自反左连接的基础。
考虑这个示例数据生成器。它模拟了在不同日期以不同间隔(每 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
我有一个 table 具有从 20000101 到 20001231 的不同日期 YYYYMMDD 和一个具有从 09:30:00 到 [=23= 的不同时间点 (HH:MM:SS) 的 table ].
我想创建一个(左)连接,每天重复 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;
作为背景:有"shorter"/少于391个观察点的日子。但是,我想确保每天有391个观察点,只是用缺失值填充。
您需要笛卡尔积,因为您想要生成日期和时间的所有组合。因此,要产生这样的结果,您需要 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
的更多信息,请遵循以下 link:
您可以执行 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;
为了显示每个日期的所有观察时间(所有日期),以及维护原始卫星信息,我将使用组合列的自反交叉连接作为自反左连接的基础。
考虑这个示例数据生成器。它模拟了在不同日期以不同间隔(每 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