我有一个表,我希望通过定义组末尾的二进制变量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中有一种简单的方法吗?
答案 0 :(得分:1)
获得新列后,此查询将为您提供所需的结果:
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 ;