MySQL使用COUNT运行总计

时间:2011-12-02 16:02:34

标签: mysql

我知道set @running_sum=0; @running_sum:=@running_sum + ...方法,但在我的情况下似乎不起作用。

我的查询:

SELECT DISTINCT(date), COUNT(*) AS count 
   FROM table1
   WHERE date > '2011-09-29' AND applicationid = '123'
   GROUP BY date ORDER BY date

结果给出了唯一的日期,以及应用程序123的出现次数。

我希望保持count的总计,以查看累积的增长。

现在我在PHP中这样做,但我想将它全部切换到MySQL。

使用本文第一行中的方法只需复制计数,而不是累积计数。

我错过了什么?

P.S。该集非常小,只有大约100个条目。

编辑:你是对的ypercube:

这是running_sum的版本:

SET @running_sum=0;
SELECT date, @running_sum:=@running_sum + COUNT(*) AS total FROM table1
   WHERE date > '2011-09-29' AND applicationid = '123'
   GROUP BY date ORDER BY date

count列最终与我刚刚打印COUNT(*)

相同

3 个答案:

答案 0 :(得分:12)

更新答案

OP要求采用单一查询方法,以便不必单独设置用户变量而不是使用变量计算运行总计:

SELECT d.date,
       @running_sum:=@running_sum + d.count AS running
  FROM (  SELECT date, COUNT(*) AS `count`
            FROM table1
           WHERE date > '2011-09-29' AND applicationid = '123'
        GROUP BY date
        ORDER BY date ) d
  JOIN (SELECT @running_sum := 0 AS dummy) dummy;

用户变量的“内联初始化”对于模拟其他分析函数也很有用。实际上,我从答案like this one中学到了这种技巧。

原始答案

您需要引入一个封闭式查询,以便在{COID(*)ed记录上列出@running_sum

SET @running_sum=0;
SELECT d.date,
       @running_sum:=@running_sum + d.count AS running
  FROM (  SELECT date, COUNT(*) AS `count`
            FROM table1
           WHERE date > '2011-09-29' AND applicationid = '123'
        GROUP BY date
        ORDER BY date ) d;

另见this answer

答案 1 :(得分:2)

SQL在运行总计时非常糟糕。由于您的结果集是有序的,因此您建议 更好地建议在客户端附加计算的运行总计列。 SQL中的任何内容都不会像那样出色。

答案 2 :(得分:1)

可以使用lib_mysqludf_ta UDF库轻松计算运行总计。

https://github.com/mysqludf/lib_mysqludf_ta#readme