想象一个SQL表votes
,其中有两列vote
和time
; 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的函数。)
答案 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在他的回答中提出的问题 - 不必从头开始节省了很多时间。