【问题标题】:Why is MySQL cumulative sum producing wrong results为什么 MySQL 累积和会产生错误的结果
【发布时间】:2016-01-24 08:05:09
【问题描述】:

我需要找到以下数据的累积和:

以下查询:

SELECT created, COUNT( * ) 
FROM  `transactions` 
GROUP BY created

给我:

created COUNT( * )  
2015-8-09   1
2015-8-15   1
2015-8-16   2
2015-8-17   1
2015-8-23   1

我试着做这样的累计和:

SELECT t1.created, COUNT( * ) , SUM( t2.totalcount ) AS sum
FROM transactions t1
INNER JOIN (

SELECT id, created c, COUNT( * ) AS totalcount
FROM transactions
GROUP BY created
ORDER BY created
)t2 ON t1.id >= t2.id
GROUP BY t1.created
ORDER BY t1.created

但它给出的结果并不像预期的那样:

created COUNT( * )  sum 
2015-8-09   5   6
2015-8-15   3   4
2015-8-16   6   8
2015-8-17   1   1
2015-8-23   4   5

我如何产生以下结果:

created COUNT( * )  sum 
2015-8-09   1   1
2015-8-15   1   2
2015-8-16   2   4
2015-8-17   1   5
2015-8-23   1   6

【问题讨论】:

标签: mysql sql cumulative-sum


【解决方案1】:

您的内部查询正在选择 id 而不对其进行分组。让我们根据日期重新修改它。

SELECT t1.created, COUNT( * ) AS daycount, SUM( t2.totalcount ) AS sum
  FROM transactions t1
 INNER JOIN ( SELECT created, COUNT( * ) AS totalcount
                FROM transactions
               GROUP BY created
            ) t2 ON t1.created >= t2.created
 GROUP BY t1.created
 ORDER BY t1.created;

或者您可能希望将总计数内联:

SELECT t1.created, COUNT(*) AS daycount
     , ( SELECT COUNT(*) FROM transactions t2
          WHERE t2.created <= t1.created ) AS totalcount
  FROM transactions t1
 GROUP BY created
 ORDER BY CREATED;

【讨论】:

  • 另一个答案显然来自更了解 MySql 的人(我是 Oracle 人),并且可能会更有效率。使用那个。
【解决方案2】:
select tmp.*, @sum := @sum + cnt as cum_sum
from
(
  SELECT created, COUNT( * ) as cnt 
  FROM  `transactions` 
  GROUP BY created
  ORDER BY created
) tmp
cross join (select @sum := 0) s

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多