MySQL的运行总数为COUNT

MySQL Running Total with COUNT

我知道set @running_sum=0; @running_sum:=@running_sum + ...方法,但是,在我看来,它似乎不起作用。

我的查询:

1
2
3
4
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个条目。

编辑:您对的超级立方体:

这是带有running_sum的版本:

1
2
3
4
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(*)

相同


更新的答案

OP要求使用单查询方法,以便不必与使用变量来计算运行总计分开设置用户变量:

1
2
3
4
5
6
7
8
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;

用户变量的

"内联初始化"对于模拟其他分析功能也很有用。的确,我从这样的答案中学到了这项技术。

原始答案

您需要引入一个封闭查询,以将COUNT(*)条记录中的@running_sum列表化:

1
2
3
4
5
6
7
8
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;

另请参阅此答案。


众所周知,SQL的运行总计很差。由于您的结果集是有序的,因此最好在客户端添加一个计算得出的运行总计列。 SQL中没有什么比它具有更高的性能了。


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

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