MySQL中的累积计数(*)

时间:2015-09-23 09:05:12

标签: mysql sql

想象一个SQL表votes,其中有两列votetime; vote是一个字符串,time是一个时间戳。我想从表中检索“累积计数”。所以,表格如下:

vote       | time
-----------+----------------
stuart     | 1443000000
stuart     | 1443000000
bryan      | 1443000000
stuart     | 1443000001
bryan      | 1443000001
bryan      | 1443000002
bryan      | 1443000002

所以,“斯图亚特”在第一时间间隔获得两票,“bryan”获得一票;他们在第二个区间分别得到一个,而bryan在第三个区间得到两个,因此我想要的结果是:

vote       | time         | cumulative total
-----------+--------------+-----------------
stuart     | 1443000000   | 2
bryan      | 1443000000   | 1
stuart     | 1443000001   | 3
bryan      | 1443000001   | 2
stuart     | 1443000002   | 3
bryan      | 1443000002   | 4

我不知道该怎么做。显然,获得每个时间间隔内发生的票数是微不足道的(SELECT vote, time, COUNT(*) from table GROUP BY time, vote ORDER BY time, vote),但是累积计数似乎更难。有办法吗?

(我正在使用MySQL,如果有用,我很乐意在这里使用特定于MySQL的函数。)

3 个答案:

答案 0 :(得分:5)

使用相关的子查询进行计数:

select distinct vote, time, (select count(*) from table t2
                             where t2.vote = t1.vote
                               and t2.time <= t1.time)
from table t1

答案 1 :(得分:1)

MySQL 8引入了对window functions的支持,这是累积总和的完美工具。与使用相关子查询的替代方法相比,它们的执行效果要好得多。您所需的查询可以编写如下:

SELECT
  vote,
  time,
  sum(count(*)) OVER (PARTITION BY vote ORDER BY time)
FROM table
GROUP BY time, vote
ORDER BY time, vote

请注意,内部count(*)是普通的聚合函数,它嵌套在外部sum(...) OVER (...)窗口函数中。这是可能的,因为aggregate functions are logically calculated before window functions

答案 2 :(得分:0)

好的,如果你确实需要>>> a = '장재인' >>> len(a) 9 行,那么你可以这样做:

stuart | 1443000002 | 3

这是SQL小提琴:http://sqlfiddle.com/#!9/960d6/11/0

我们需要做的是创建一个包含名称和时间组合的表(没有条件的连接),然后使用所有这些组合计算原始表中的计数。

感谢@jarlh在他的回答中提出的问题 - 不必从头开始节省了很多时间。