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

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

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

Numbers        group_generator    
10             0    
20             0    
30             1    
40             0    
50             1 
60             1

我需要把数字分成三组:

(10, 20, 30); 
(40, 50); 
(60)

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

Numbers        group_generator    group
10             0                  0
20             0                  0
30             1                  0
40             0                  1
50             1                  1
60             1                  2

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

6kkfgxo0

6kkfgxo01#

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

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

输出:

group_concat(numbers)
10,20,30
40,50
60

所以整个查询可以是:

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

输出

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

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

DELIMITER //
drop PROCEDURE if EXISTS groupit
//
create procedure groupit()
begin
   declare num int;
   declare numgroup varchar(1024) default '';
   declare gnum int default 0;
   declare pid int default 1;
   declare gg int;

   DECLARE CONTINUE HANDLER FOR NOT FOUND SET gg = -1;

   repeat
     select group_generator, Numbers  into gg, num from table2 where id=pid;
     if (gg >= 0) then
         set numgroup = concat(numgroup, if(numgroup='', '', ','), num);
         if (gg = 1) then
             select numgroup, gnum;
             set numgroup = '';
             set gnum = gnum + 1;
         end if;
     end if;
     set pid=pid+1;
   until gg = -1
   end repeat;
end
//
delimiter ;

相关问题