我在mysql中有一个表,其中有100行,它们的ids不是连续的,但可以按日期字段排序。
我需要生成一个查询,该查询为10个最旧的记录选择字段总和,然后选择从记录2到记录11的字段总和,依此类推,直到我达到90-100。这些结果将按第一列分组,这是一个数字,以显示它在计算中的位置。
例如:
Record_id Sum(field-a) sum(field-b ) sum(field-c) rows used:
group1 6 3 1 1-10
group2 7 3 0 2-11
group3 7 2 1 3-12此外,正在添加新的行,并且这些计算将需要对每个新行的添加进行重新计算,以获得最新的100行,即行1被忽略行101变为第100行。
希望这是有意义的。
如果这对于mysql来说太多了,那么php也是一个选择。
我已经尝试了一些基本的select语句,每个字段的sums限制为10条记录或100条记录,我正在考虑limit 10 offset 1,其中offset随后递增。
我可以选择创建新的表或视图。
提前感谢任何可以帮助我进步的想法或代码。
发布于 2013-01-17 23:08:48
我想我知道您想要什么,但是您的示例查询引用了a、b和c。
要获得部分累积和,您确实需要一个序列号。在MySQL中,您可以使用相关子查询来获得此结果。其余的是一个自连接,然后是一个聚合:
select concat('group', t.seqnum), sum(t.field) as sum,
MIN(t2.seqnum) as firstrow, max(t2.seqnum) as lastrow
from (select t.*,
(select count(*) from t t2 where t2.date <= t.date) as seqnum
from t
) t join
(select t.*,
(select count(*) from t t2 where t2.date <= t.date) as seqnum
from t
) t2
on t2.seqnum between t.seqnum and t.seqnum + 10
group by t.seqnum注意:此SQL尚未经过测试,因此可能存在语法错误。
发布于 2013-01-17 23:14:36
考虑这个例子。此查询返回每行加上前面3行的总和。我在这个示例中使用了一组连续的数字,但该技术在您的表上也是一样的……
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
SELECT a.i
, SUM(b.i) ttl
FROM
( SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i ) a
JOIN
( SELECT x.*, COUNT(*) rank FROM ints x JOIN ints y ON y.i <= x.i GROUP BY i ) b
ON b.rank BETWEEN a.rank-3 AND a.rank
GROUP
BY a.i;
+---+------+
| i | ttl |
+---+------+
| 0 | 0 |
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
| 5 | 14 |
| 6 | 18 |
| 7 | 22 |
| 8 | 26 |
| 9 | 30 |
+---+------+https://stackoverflow.com/questions/14381847
复制相似问题