mysql:按二进制变量的和对行进行分组

ubbxdtey  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(338)

我有一个表,我想用一个二进制变量来分组 group_generator 这定义了组的结尾:如果它等于 1 ,则组包含前面的所有行 group_generator = 0 例子:

  1. Numbers group_generator
  2. 10 0
  3. 20 0
  4. 30 1
  5. 40 0
  6. 50 1
  7. 60 1

我需要把数字分成三组:

  1. (10, 20, 30);
  2. (40, 50);
  3. (60)

我试着用 group_generator 对于索引小于当前值的所有行,如下所示:

  1. Numbers group_generator group
  2. 10 0 0
  3. 20 0 0
  4. 30 1 0
  5. 40 0 1
  6. 50 1 1
  7. 60 1 2

并按最后一列进行分组,但如果没有临时表,情况会很复杂。
在mysql中有没有一种简单的方法可以做到这一点?

6kkfgxo0

6kkfgxo01#

一旦您有了新的列,此查询将为您提供所需的结果:

  1. SELECT GROUP_CONCAT(Numbers) FROM table GROUP BY `group`

输出:

  1. group_concat(numbers)
  2. 10,20,30
  3. 40,50
  4. 60

所以整个查询可以是:

  1. SELECT GROUP_CONCAT(Numbers),
  2. (SELECT IFNULL(SUM(group_generator), 0) FROM table1 t2 WHERE t2.id < table1.id) AS `group`
  3. FROM table1
  4. GROUP BY `group`

输出

  1. group_concat(Numbers) group
  2. 10,20,30 0
  3. 40,50 1
  4. 60 2

还可以使用存储过程生成此输出:

  1. DELIMITER //
  2. drop PROCEDURE if EXISTS groupit
  3. //
  4. create procedure groupit()
  5. begin
  6. declare num int;
  7. declare numgroup varchar(1024) default '';
  8. declare gnum int default 0;
  9. declare pid int default 1;
  10. declare gg int;
  11. DECLARE CONTINUE HANDLER FOR NOT FOUND SET gg = -1;
  12. repeat
  13. select group_generator, Numbers into gg, num from table2 where id=pid;
  14. if (gg >= 0) then
  15. set numgroup = concat(numgroup, if(numgroup='', '', ','), num);
  16. if (gg = 1) then
  17. select numgroup, gnum;
  18. set numgroup = '';
  19. set gnum = gnum + 1;
  20. end if;
  21. end if;
  22. set pid=pid+1;
  23. until gg = -1
  24. end repeat;
  25. end
  26. //
  27. delimiter ;
展开查看全部

相关问题