Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于条件结束的SAS宏循环_Sql_Loops_Sas_Sas Macro - Fatal编程技术网

Sql 基于条件结束的SAS宏循环

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

我在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;  
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行,它运行得很好。需要一些时间-所以我将看看我是否也不能用数据步骤来完成。非常感谢:)如果你知道我如何把它标记为一个解决方案,请让我知道。我是新来的,但我想给这个答案的信用。