此答案的第二部分使用变量来创建另一列的累加和。我正在做相同的事情,除了我正在使用一条GROUP BY语句,并求和COUNT(*)而不是一列。这是我的代码,用于创建最小表并插入值:
GROUP BY
COUNT(*)
CREATE TABLE `test_group_cumulative` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `group_id` int(11) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; INSERT INTO `test_group_cumulative` (`id`, `group_id`) VALUES (1, 1), (2, 2), (3, 3);
这是失败的代码:
SELECT `group_id`, COUNT(*) AS `count`, @count_cumulative := @count_cumulative + COUNT(*) AS `count_cumulative` FROM `test_group_cumulative` AS `tgc` JOIN (SELECT @count_cumulative := 0) AS `_count_cumulative` GROUP BY `group_id` ORDER BY `id`;
结果如下:
group_id count count_cumulative 1 1 1 2 1 1 3 1 1
如您所见,count_cumulative未正确汇总。但是,这是奇怪的部分。如果我用COUNT(*)incount_cumulative的值替换in 1,则查询可以正常工作。
count_cumulative
1
@count_cumulative := @count_cumulative + 1 AS `count_cumulative`
这是正确的结果:
group_id count count_cumulative 1 1 1 2 1 2 3 1 3
显然,在我的应用中,每个组中将有一个以上的项目,因此COUNT(*)不会总是存在1。我知道可以通过联接或子查询来执行此操作,如果需要的话,我会执行此操作,但是在我看来,这应该工作。那么,为什么不在COUNT(*)累计金额之内工作呢?
我在进行时间序列分析时经常遇到这个问题。解决此问题的首选方法是将其包装到第二个选择中,然后在最后一层引入计数器。如果需要,您可以使用临时表使此技术适应更复杂的数据流。
我使用您提供的模式做了这个小sqlfiddle: http://sqlfiddle.com/#!2/cc97e/21
http://sqlfiddle.com/#!2/cc97e/21
这是获取累积计数的查询:
SELECT tgc.group_id, @count_cumulative := @count_cumulative + cnt as cum_cnt FROM ( SELECT group_id, COUNT(*) AS cnt FROM `test_group_cumulative` group by group_id order by id) AS `tgc`, (SELECT @count_cumulative := 0) AS `temp_var`;
这是我得到的结果:
GROUP_ID CUM_CNT 1 1 2 2 3 3
您的尝试失败的原因:
当您使用临时变量进行分组时,mysql将独立执行各个组,并在为每个组分配临时变量当前值时(在这种情况下为0)。
如果,您运行此查询:
SELECT @count_cumulative;
之后立马
您将获得值1。对于每个组,@ count_cumulative都将重置为0。
因此,在我提出的解决方案中,我通过先生成“组计数”然后进行累加来规避此问题。