在sqlite3中计算累积值的有效方法

时间:2011-01-30 05:07:33

标签: sql sqlite

我有一个sqlite3表,告诉我什么时候在游戏中获得/失分。样本/查询结果:

SELECT time,p2 FROM events WHERE p1='barrycarter' AND action='points' 
ORDER BY time; 

1280622305|-22 
1280625580|-9 
1280627919|20 
1280688964|21 
1280694395|-11 
1280698006|28 
1280705461|-14 
1280706788|-13 
[etc] 

我现在想要我的跑步点。鉴于我开始有1000点, 这是一种方法。

SELECT DISTINCT(time), (SELECT 
1000+SUM(p2) FROM events e WHERE p1='barrycarter' AND action='points' 
AND e.time <= e2.time) AS points FROM events e2 WHERE p1='barrycarter' 
AND action='points' ORDER BY time 

但这非常低效。写这个更好的方法是什么?

MySQL有@variables所以你可以这样做:

SELECT time, @tot := @tot+points ... 

但是我正在使用sqlite3,而且上面不是ANSI标准SQL。

有关数据库的更多信息,如果有人需要它:http://ccgames.db.94y.info/

编辑:谢谢你的回答!我的困境:我让任何人都跑了 对“http://ccgames.db.94y.info/”的 SELECT查询。我想给 他们有用的访问我的数据,但没有到允许的程度 脚本或允许多个状态查询。所以我需要一个 可以做累积的SQL查询。另见:
Existing solution to share database data usefully but safely?

2 个答案:

答案 0 :(得分:1)

SQLite意味着是一个小型嵌入式数据库。鉴于该定义,找到许多限制并不是不合理的。手头的任务不能单独使用SQLite来解决,或者你发现它会非常慢。您编写的查询是一个三角形交叉连接,它不会缩放,或者更确切地说,会缩放。

解决问题的最有效方法是通过使用SQLite的程序,例如如果您在HTML5中使用Web SQL,则可以轻松地在JavaScript中累积。

答案 1 :(得分:1)

sqlite mailing list中有关于此问题的讨论。

您的两个选项是:

  1. 使用游标迭代所有行并计算客户端上的运行总和。
  2. 存储总和而不是存储点数。 (如果你只存储总和,你可以通过总和(n) - 总和(n-1)得到积分,这是快的。