仅对连续行执行sql group by

ymdaylpp  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(298)

我有一张table,看起来像:

SITE      LOWER   UPPER   SIZE
a.com     0.1     0.2     10
a.com     0.2     0.3     10
a.com     0.3     0.4     10
a.com     0.7     0.8     10
a.com     0.9     1.0     10
b.com     0.1     0.2     20
a.com     0.6     0.7     30

我想要的结果是:

SITE      LOWER   UPPER   SIZE
a.com     0.1     0.4     10
a.com     0.7     1.0     10
b.com     0.1     0.2     20
a.com     0.6     0.7     30

所以对于一个 SITE 以及 SIZE 一对,我需要压缩 LOWER 以及 UPPER 值在哪里 LOWER 按行分组的最小值是第一行和 UPPER 是最后一行的最大值。 LOWER 以及 UPPER 类似于某些bucket的上下限值(例如[0.1,0.2]),我只需要将连续的bucket压缩在一起。在这方面任何帮助都将不胜感激。

a0zr77ik

a0zr77ik1#

可以使用变量将组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;

这是一个sql小提琴。

相关问题