this answer 的第二部分使用变量来创建另一列的累积总和。我正在做同样的事情,除了我使用的是 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(*)
中的 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
这是获取累积计数的查询:
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
您的尝试无效的原因:
当你用临时变量做 group by 时,mysql 独立执行各个组,同时每个组被分配临时变量当前值,在这种情况下为 0。
如果,您运行此查询:
SELECT @count_cumulative;
之后立马
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`;
你会得到值 1。对于你的每个组,@count_cumulative 被重置为 0。
因此,在我提出的解决方案中,我通过首先生成“组计数”然后进行累加来规避这个问题。
关于mysql - 不能累计求和 `COUNT(*)`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25062874/