MySQL 分组累加Demo
题目
累计并输出number的值,按照code分组,id排序,数据和期待结果如下:
方式1:单独累计
每一行单独计算截止到当前行,相同分组条件的number累加并输出,适用于任意版本的mysql,缺点是效率低,sql语句如下:
SELECT id, `code`, number,
( SELECT SUM( number ) FROM demo_group_sum WHERE `code` = A.`code` AND id <= A.Id ) sumNumber
FROM demo_group_sum A
ORDER BY A.id;
方式2:sum() over(partition)
借助mysql聚合函数,要求mysql 版本不低于v8.0,查询当前sql版本号:select VERSION();
sql语句如下:
select id,code,number,
sum(number) over(partition by `code` order by id) sumNumber
FROM demo_group_sum;
语法结构:sum(累加值字段) over(partition by 分组字段 order by 排序字段)
注意:
-
sum、over关键字和后边的左括号之间不能有空格。
-
over() 里如果不跟order by 字段,只会简单的把同分组的值加起来,效果类似
sum(number) group by code
,结果如下:
附录:建表及测试数据脚本
DROP TABLE IF EXISTS `demo_group_sum`;
CREATE TABLE `demo_group_sum` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` char(2) DEFAULT NULL,
`number` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO `demo_group_sum` VALUES (1, 'A', 1);
INSERT INTO `demo_group_sum` VALUES (2, 'A', 3);
INSERT INTO `demo_group_sum` VALUES (3, 'B', 2);
INSERT INTO `demo_group_sum` VALUES (4, 'B', 2);
INSERT INTO `demo_group_sum` VALUES (5, 'B', 3);
INSERT INTO `demo_group_sum` VALUES (6, 'C', 1);
INSERT INTO `demo_group_sum` VALUES (7, 'D', 5);
COMMIT;
Joe小学弟