第一个x行数的字段总和,每个后续行偏移+1

时间:2013-01-17 14:59:35

标签: php mysql sum offset

我在mysql中有一个表,其中有100行,其中id不是连续的,但可以按日期字段排序。

我需要生成一个查询,选择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语句,每个字段的总和,限制为10条记录或100条记录,我正在考虑限制10偏移1,其中偏移量会增加。

我可以选择创建新的表格或视图。

提前感谢任何有助于我进步的想法或代码。

2 个答案:

答案 0 :(得分:1)

我认为我理解您的需求,但您的示例查询引用了abc

要获得部分累积总和,您确实需要一个序列号。在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尚未经过测试,因此可能存在语法错误。

答案 1 :(得分:1)

考虑这个例子。此查询返回每行的总和加上前面的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 |
+---+------+