一条SQL语句求前面记录的平均值
2014-05-13 21:32
288 查看
有算法要求如下:
用一条SQL语句实现它:
分别用表变量 @ta 和 @t 来对应 ta 和 t。
则有SQL语句:
=================================================
但是这种方法有很严重的性能问题。后面记录求前面所有记录的平均值,每条记录都要将前面的算一遍,而完全没有办法重用前面的计算结果,当列很多,记录也很多的情况下,耗时非常的长。
这个时候,老老实实用游标,用循环来算,搞一些变量来保存中间值,性能反而很好。
真让人感慨,都说SQL的强项不在循环,应该尽量用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.av from @ta a inner join w on a.id=w.id;
=================================================
但是这种方法有很严重的性能问题。后面记录求前面所有记录的平均值,每条记录都要将前面的算一遍,而完全没有办法重用前面的计算结果,当列很多,记录也很多的情况下,耗时非常的长。
这个时候,老老实实用游标,用循环来算,搞一些变量来保存中间值,性能反而很好。
真让人感慨,都说SQL的强项不在循环,应该尽量用SQL语句来代替循环,但在这里,却恰好相反。兵无常势,水无常形,SQL的性能问题,也不是那么死板的。
相关文章推荐
- 一条SQL语句求前面记录的平均值
- 从数据库中随机抽取一条记录的SQL语句
- 一条Sql语句:取出表A中第31到第40记录(面试题)
- sql面试题:用一条SQL语句查出不重复的所有记录
- Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 wher
- 取每组数据的第一条记录和最后一条记录的SQL语句
- 使用传入的总记录数实现一条sql语句完成分页查询
- 一条sql搞定从查询语句中向目标表中插入记录并去重发插入
- 转:使用一条SQL语句删除表中重复记录
- Sql server 删除重复记录的SQL语句保留一条
- SQL一条语句统计记录总数及各状态数
- 有两张表,结构相同,写一条sql语句,将表A里不同内容的记录复制到表B里
- 写出一条SQL语句:取出表A中第31到40行记录(SQLserver,以自增长的ID作为主键,注意:
- 关于多条id相同,只取其中一条记录的sql语句
- SQL语句实现删除重复记录并只保留一条
- SQLite一条SQL语句插入多条记录
- 一条SQL语句,关于字符分割关联多条记录的问题
- 关于多条id相同,只取一条记录得sql语句
- 使用一条SQL语句删除表中重复记录
- 用一条sql语句删除表中所相同记录