【问题标题】:Sum of fields of first x number of rows, offset +1 each subsequent row前 x 行的字段总和,每个后续行偏移 +1
【发布时间】:2013-01-17 14:59:35
【问题描述】:

我在 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也是一种选择

我已经尝试了一些基本的选择语句,每个字段的总和限制为 10 条记录或 100 条记录,我正在考虑限制 10 偏移量 1,然后偏移量增加。

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

提前感谢任何可以帮助我进步的想法或代码。

【问题讨论】:

    标签: php mysql sum offset


    【解决方案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 未经测试,因此可能存在语法错误。

    【讨论】:

    • 为清楚起见抱歉:应该只是字段a,字段b和字段c,它们都在同一个表中
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      相关资源
      最近更新 更多