可以使用变量将组ID分配给相邻行:
select t.*,
(@grp := IF(@sru = CONCAT_WS(':', site, rev, lower),
IF(@sru := CONCAT_WS(':', site, rev, upper), @grp, @grp),
IF(@sru := CONCAT_WS(':', site, rev, upper) , @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by site, size, lower
) cross join
(select @grp := 0, @sru := '') params;
然后您可以聚合以获得所需的内容:
select site, size, min(lower) as lower, max(upper) as upper
from (select t.*,
(@grp := IF(@sru = CONCAT_WS(':', site, rev, lower),
IF(@sru := CONCAT_WS(':', site, rev, upper), @grp, @grp),
IF(@sru := CONCAT_WS(':', site, rev, upper) , @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by site, size, lower
) cross join
(select @grp := 0, @sru := '') params
) t
group by size, size, grp;
Here
是一个SQL助手。