我有一张表A,里面有实时值。
Amount Count Pct1 Pct2 300 2 0.000 100.000 1,891 2 0.001 100.000 500 2 0.000 100.000 100 2 0.000 100.000 1,350 2 0.001 100.000 2,648 2 0.001 100.000 2,255 2 0.001 100.000 500 2 0.000 100.000 200 2 0.000 30.441 10 2 0.000 100.000 1,928 2 0.001 100.000 40 2 0.000 100.000 200 2 0.000 100.000 256 2 0.000 100.000 254 2 0.000 100.000 100 2 0.001 100.000 50 1 0.000 33.333 1,512 2 0.001 100.000
我有一套带有一系列条件的表B.我想在SAS中生成条件成功计数。即如果我将下表中的第1行作为条件传递给表A,则成功2次。我正在使用联接来生成cartesin产品,但效率不高。我想要一种有效的方法来解决这个问题(类似于countifs函数在excel中的作用)。非常感谢你的帮助。
Amount Count Pct1 Pct2 Condion Success Count 1,576 2 0 100 4 1,537 2 0 100 4 1,484 2 0 100 5 1,405 2 0 100 5 1,290 2 0 100 6 1,095 2 0 100 6 948 2 0 100 6 932 2 0 100 6 914 2 0 100 6 887 2 0 100 6 850 2 0 100 6 774 2 0 100 6 707 2 0 100 6 704 2 0 100 6 695 2 0 100 6 646 2 0 100 6 50 1 0 5.42 16 50 1 0 5.42 16
答案 0 :(得分:1)
你说过你曾尝试过制作笛卡尔产品。但是,由于您没有发布任何代码,我不确定您是否尝试制作完整产品然后计算行数。在一个SQL语句中进行计数要快得多,因为实际上完全没有在任何地方写入完整的笛卡尔积。像这样:
proc sql;
create table tableC as
select c.*, coalesce(s,0) as SuccessCount from TableB c
left join (
select id, count(*) as s from TableA a,TableB b
where
a.amount >= b.amount and
a.count >= b.count and
a.pct1 >= b.pct1 and
a.pct2 >= b.pct2
group by id
) as d
on c.id = d.id
;
quit;
请注意,tableB需要一些唯一的id列。你应该总是有一些列用作id,但如果你没有它已经很简单就像这样创建它,例如:
data tableB;
set tableB;
id = _N_;
run;