Sql 基于条件结束的SAS宏循环
我在SAS中编写&主要使用procsql进行数据清理 我有一段代码,其中我顺序地从表中取出记录(ID)。我希望代码循环,直到表耗尽。我写了一个叫做catalina的宏。我希望它一直运行,直到我在宏的最后一行生成的count变量为=到0为止Sql 基于条件结束的SAS宏循环,sql,loops,sas,sas-macro,Sql,Loops,Sas,Sas Macro,我在SAS中编写&主要使用procsql进行数据清理 我有一段代码,其中我顺序地从表中取出记录(ID)。我希望代码循环,直到表耗尽。我写了一个叫做catalina的宏。我希望它一直运行,直到我在宏的最后一行生成的count变量为=到0为止 %macro catalina; proc sql; create table todelete as select max(id_todelete) as id_todelete from ids group by id_todelete; de
%macro catalina;
proc sql;
create table todelete as select max(id_todelete) as id_todelete from ids group by id_todelete;
delete from pairs where id_a = any(select id_todelete from todelete);
delete from pairs where id_b = any(select id_todelete from todelete);
insert into matched select * from pairs where match_dist = (select min(match_dist) from pairs);
insert into ids (id_todelete) select id_a from matched;
insert into ids (id_todelete) select id_b from matched;
select count(*) as count from pairs;
%mend;
pin是我的唯一查找值。我的表中包含要从父表中顺序删除的管脚,直到该表降到0为止
谢谢你的帮助 要让宏生成多个代码块,需要一些宏逻辑。看起来您需要一个简单的%DO%UNTIL()构造。请注意,您需要在最后一步中创建一个实际的宏变量,而不是像当前代码那样将结果打印到输出目标。您是否确定您的流程将始终达到零obs?如果没有,则添加更多逻辑,以在一些固定数量的步骤后停止。或者,可能会基于其他一些总是会发生的标准停止,比如检测到要删除的零观测值 因此,将不重复的部分放在%DO循环之前或之后
%macro catalina;
%local count ;
%let count=-1;
proc sql;
%do %until(&count <= 0);
create table todelete as
select max(pin_todelete) as pin_todelete from pins group by pin_todelete
;
delete from pairs where pin_a = any(select pin_todelete from todelete);
delete from pairs where pin_b = any(select pin_todelete from todelete);
insert into matched
select * from pairs
where match_dist = (select min(match_dist) from pairs)
;
insert into pins (pin_todelete) select pin_a from matched;
insert into pins (pin_todelete) select pin_b from matched;
select count(*) format=32. into :count trimmed from pairs;
%end;
quit;
%mend;
%macro catalina;
%本地计数;
%让计数=-1;
proc-sql;
%直到(&count第一个查询有点含糊不清。您希望它按哪些值分组?输入变量pin_todelete?还是输出变量pin_todelete?Thx!我的pairs表中有匹配项,这些匹配项与pin_a到pin_b匹配。pin是唯一的,但我在两列中都有多个匹配项和重复的pin&pin_a al中的pin所以出现在pin_b中。我试图通过最小化pairs表中的match_dist变量来找到“最佳匹配”。一旦我“找到最佳匹配”,我想将其删除并填充到匹配表中。然后我想从pairs表中删除该匹配中涉及的pin(列:pin_a和pin_b)这样就不会再次选择这些管脚作为匹配项。我想这样做,直到pairs表耗尽。表pins
和pairs
有多大?使用数据步骤和哈希组件对象或数组,您可能会获得更快的处理速度。pairs表有800万条记录,然后是pins选项卡le是我跟踪管脚(变量)的地方,在我选择了它们的“最佳匹配”之后,我将从pairs表中删除这些管脚。我将尝试考虑一个数据步骤。苛刻的组件对象和数组对我来说是新的。我更熟悉sql,所以我的目标始终是proc sql。谢谢!谢谢!我想如果我稍微调整一下停止条件,这可能对我有用。我不确定它是否会像你说的那样运行到零。我也不熟悉宏,所以可以花一些时间真正学习%DO%直到()的时间。这确实帮助我思考它。非常感谢!为此,非常感谢!以上的工作!我只需要取出你拥有的第3行,它运行得很好。需要一些时间-所以我将看看我是否也不能用数据步骤来完成。非常感谢:)如果你知道我如何把它标记为一个解决方案,请让我知道。我是新来的,但我想给这个答案的信用。