一条SQL语句求前面记录的平均值

网友投稿 627 2022-12-02

一条SQL语句求前面记录的平均值

一条SQL语句求前面记录的平均值

算法要求如下:

For (i=1,i<=10,i++){ ta[i] = (t[1] + t[2] + ... + t[i]) / i;}

用一条SQL语句实现它:

分别用表变量 @ta 和 @t 来对应 ta 和 t。

declare @t table(id int,d decimal(18,4));declare @ta table(id int,da decimal(18,4));insert into @t(id,d) values(1,1);insert into @t(id,d) values(2,2);insert into @t(id,d) values(3,3);insert into @t(id,d) values(4,4);insert into @t(id,d) values(5,5);insert into @t(id,d) values(6,6);insert into @t(id,d) values(7,7);insert into @t(id,d) values(8,8);insert into @t(id,d) values(9,9);insert into @t(id,d) values(10,10);insert into @ta(id,da) values(1,0);insert into @ta(id,da) values(2,0);insert into @ta(id,da) values(3,0);insert into @ta(id,da) values(4,0);insert into @ta(id,da) values(5,0);insert into @ta(id,da) values(6,0);insert into @ta(id,da) values(7,0);insert into @ta(id,da) values(8,0);insert into @ta(id,da) values(9,0);insert into @ta(id,da) values(10,0);

则有SQL语句:

with w(id,av) as(select a.id,avg(b.d) from @ta a,@t b where a.id>=b.id group by a.id)update @ta set da=w.avfrom @ta a inner join w on a.id=w.id;

=================================================

但是这种方法有很严重的性能问题。后面记录求前面所有记录的平均值,每条记录都要将前面的算一遍,而完全没有办法重用前面的计算结果,当列很多,记录也很多的情况下,耗时非常的长。

这个时候,老老实实用游标,用循环来算,搞一些变量来保存中间值,性能反而很好。

真让人感慨,都说SQL的强项不在循环,应该尽量用SQL语句来代替循环,但在这里,却恰好相反。兵无常势,水无常形,SQL的性能问题,也不是那么死板的。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:EF学习笔记——通用增删改查方案
下一篇:WPF学习笔记——ListBox用ItemsSource绑定数据源
相关文章

 发表评论

暂时没有评论,来抢沙发吧~