楼主: lcx0107
2975 12

[原创博文] 请高手编程,谢谢! [推广有奖]

11
soporaeternus 发表于 2010-10-14 22:43:20
假如数据集a

n  x
1  10
2  32
3  11
那么a a left join a b就生成
n (a) x(a)  n(b)  x(b)
1    10     1    10
1    10     2    32
1    10     3    11
2    32     1    10
2    32     2    32
2    32     3    11
3    11     1    10
3    11     2    32
3    11     3    11
的数据形式
增加on a.n>b.n 和a.x>b.x连接条件后
以上数据变成
n (a) x(a)  n(b)  x(b)
1    10     .     .
2    32     1    10
3    11     1    10
group by a.n,a.x表示所有相同的n(a),x(a)归为一组
计算他们的count(n(b))的值,即计算n(b)的个数,有一条算一条,“.”计为0
所以最后结果为
1 10 0
2 32 1
3 11 1
Let them be hard, but never unjust

12
lcx0107 发表于 2010-10-14 23:33:04
非常感谢! 11# soporaeternus

13
hongxx 发表于 2010-10-15 22:03:42
soporaeternus 发表于 2010-10-14 22:13
data步生成数据集,也就是你需要计算的原数据

sql步就是实现对于a中每一条数据,在a中序号n比它小的数据中找出所有x值比它小的记录,并且记个数(count函数)

不知道说清楚没有......
对比一下执行速度:
  1. data a;
  2.         do n=1 to 1000 by 1;
  3.                 x=ceil(ranuni(123)*100);
  4.                 output;
  5.         end;
  6. run;
  7. proc sql;
  8.     create table b_1 as
  9.         select distinct one.n,one.x,sum(one.x>two.x) as x_bigcount
  10.         from a one left join a two
  11.         on one.n>=two.n
  12.         group by one.n;
  13. quit;
复制代码



这个代码的执行速度比你上面那个慢了至少一倍。看来能在where或者on上加上条件【one.x>two.x】比放在变量里计算【sum(one.x>two.x) 】里快得多,当然用到distinct也会费时。
这就是代码的优化。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-21 11:33