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;
posted @ 2023-01-31 12:56  Zhuhj  阅读(422)  评论(0编辑  收藏  举报