F****3 发帖数: 1504 | 1 我用SQL是这样搞的:
proc sql;
create table WANT as
select distinct a.*, b.VAR1 , b.VAR2
from HAVE1 as a left join HAVE2 (DROP=link_count) as b
on a.PATIENT_ID = b.PATIENT_ID and a.YEAR = b.YEAR;
quit;
但是应为硬盘容量有限,所以只能用DATA STEP了。请问出来的WANTtable是不是一模一
样的啊?
proc sort data=HAVE1;
by PATIENT_ID YEAR;
run;
proc sort data=HAVE2(keep=PATIENT_ID YEAR VAR1 VAR2);
by PATIENT_ID YEAR;
run;
data WANT;
merge HAVE1 (in=a) HAVE2(in=b);
by PATIENT_ID YEAR;
if a;
run; |
F****3 发帖数: 1504 | |
j******o 发帖数: 127 | 3 可以,如果你的文件太大,sort会很慢。用hash之前要确定你的内存够用。
【在 F****3 的大作中提到】 : 我用SQL是这样搞的: : proc sql; : create table WANT as : select distinct a.*, b.VAR1 , b.VAR2 : from HAVE1 as a left join HAVE2 (DROP=link_count) as b : on a.PATIENT_ID = b.PATIENT_ID and a.YEAR = b.YEAR; : quit; : 但是应为硬盘容量有限,所以只能用DATA STEP了。请问出来的WANTtable是不是一模一 : 样的啊? : proc sort data=HAVE1;
|
F****3 发帖数: 1504 | 4 服务器内存是256GB,我可以用memsize option把它搞成max。请问这样应该就可以了吧?
请问为什么sql巨慢呢?我写的data step是不是做的事情和SQL的效果是一模一样啊?
谢谢!!! |
D******n 发帖数: 2836 | 5 你的datasets都多大?
吧?
【在 F****3 的大作中提到】 : 服务器内存是256GB,我可以用memsize option把它搞成max。请问这样应该就可以了吧? : 请问为什么sql巨慢呢?我写的data step是不是做的事情和SQL的效果是一模一样啊? : 谢谢!!!
|
F****3 发帖数: 1504 | 6 两个文件,大的是400GB,小的是800 MB,应该能handle的。硬盘可用空间有1.4 tB,
每次都算的爆满然后爆掉。不知道是什么问题。。。 |
D******n 发帖数: 2836 | 7 a 是400G, b是800mb?
【在 F****3 的大作中提到】 : 两个文件,大的是400GB,小的是800 MB,应该能handle的。硬盘可用空间有1.4 tB, : 每次都算的爆满然后爆掉。不知道是什么问题。。。
|
o*****m 发帖数: 950 | 8 可以。注意除了by variable, 其它变量不要有重名, 否则值可能被改
我用SQL是这样搞的:proc sql;
【在 F****3 的大作中提到】 : 我用SQL是这样搞的: : proc sql; : create table WANT as : select distinct a.*, b.VAR1 , b.VAR2 : from HAVE1 as a left join HAVE2 (DROP=link_count) as b : on a.PATIENT_ID = b.PATIENT_ID and a.YEAR = b.YEAR; : quit; : 但是应为硬盘容量有限,所以只能用DATA STEP了。请问出来的WANTtable是不是一模一 : 样的啊? : proc sort data=HAVE1;
|
F****3 发帖数: 1504 | 9 是的。
不知道怎么搞的,在大data上运行不了。
【在 D******n 的大作中提到】 : a 是400G, b是800mb?
|
F****3 发帖数: 1504 | 10 真不好意思啊。你说的有重名,请问可以举一个例子吗?
假设Have1 有下面几个variable (400 GB的那个)
hospital_visit_id, date, time, patient_id, document_id
Have2有下面几个variable (800 MB的那个)
patient_id, document_id, diag_date, diag_type
应该就没有问题吧?
如果另外我把前面条件改动,让HAVE1和HAVE2都有一个共同的variable叫comomon_
variable,这种情况就会出现你提到的改动问题吧?谢谢!
【在 o*****m 的大作中提到】 : 可以。注意除了by variable, 其它变量不要有重名, 否则值可能被改 : : 我用SQL是这样搞的:proc sql;
|
|
|
s******8 发帖数: 102 | 11 你这种情况是该用hash,假设have2是800M.
data merged;
length var1 var2 $8.;*这里要根据实际情况改,但必须定义var1 var2;
if _n_=1 then do;
dcl hash h(dataset:"have2");
h.definekey("PATIENT_ID","YEAR");
h.definedata("VAR1","VAR2");
h.definedone();
call missing(var1,var2);
end;
set have1;
if h.find() ne 0 then call missing(var1,var2);
run; |
F****3 发帖数: 1504 | 12 太谢谢了!
【在 s******8 的大作中提到】 : 你这种情况是该用hash,假设have2是800M. : data merged; : length var1 var2 $8.;*这里要根据实际情况改,但必须定义var1 var2; : if _n_=1 then do; : dcl hash h(dataset:"have2"); : h.definekey("PATIENT_ID","YEAR"); : h.definedata("VAR1","VAR2"); : h.definedone(); : call missing(var1,var2); : end;
|
s******0 发帖数: 1269 | |
s*********h 发帖数: 6288 | 14 马克
【在 s******8 的大作中提到】 : 你这种情况是该用hash,假设have2是800M. : data merged; : length var1 var2 $8.;*这里要根据实际情况改,但必须定义var1 var2; : if _n_=1 then do; : dcl hash h(dataset:"have2"); : h.definekey("PATIENT_ID","YEAR"); : h.definedata("VAR1","VAR2"); : h.definedone(); : call missing(var1,var2); : end;
|
g****8 发帖数: 2828 | 15 学习
【在 s******8 的大作中提到】 : 你这种情况是该用hash,假设have2是800M. : data merged; : length var1 var2 $8.;*这里要根据实际情况改,但必须定义var1 var2; : if _n_=1 then do; : dcl hash h(dataset:"have2"); : h.definekey("PATIENT_ID","YEAR"); : h.definedata("VAR1","VAR2"); : h.definedone(); : call missing(var1,var2); : end;
|
o****o 发帖数: 8077 | 16 你这个先不能把两个数据分别distinct了么?
分别有多少duplicates?
把第二个用index,然后用SET KEY=就行了,很快的
【在 F****3 的大作中提到】 : 我用SQL是这样搞的: : proc sql; : create table WANT as : select distinct a.*, b.VAR1 , b.VAR2 : from HAVE1 as a left join HAVE2 (DROP=link_count) as b : on a.PATIENT_ID = b.PATIENT_ID and a.YEAR = b.YEAR; : quit; : 但是应为硬盘容量有限,所以只能用DATA STEP了。请问出来的WANTtable是不是一模一 : 样的啊? : proc sort data=HAVE1;
|