我一直在SQLITE中的RLE空间四处游荡,并跑过这篇文章。我相信这个代码适用于#1。第一个答案是正确的,这在SQLite中是一个单一的查询。
create table example (id integer primary key autoincrement, val integer);
insert into example (val) values (33);
insert into example (val) values (33);
insert into example (val) values (44);
insert into example (val) values (28);
insert into example (val) values (44);
insert into example (val) values (44);
select ren.low_id, e2.val, (ren.high_id - ren.low_id)+1
from example e2
inner join (
select min(hb.low_id) as low_id, hb.high_id as high_id
from
(
with nexample(low_id, high_id, val)
as
(
select e.id, e.id, e.val from example e
union all
select ne.low_id, eu.id, ne.val
from nexample ne
inner join example eu on eu.id = ne.high_id+1 AND eu.val=ne.val
)
select ne.low_id, max(ne.high_id) as high_id from nexample ne
group by ne.low_id
) hb
group by hb.high_id
) ren on ren.low_id = e2.id;
输出:
1|33|2
3|44|1
4|28|1
5|44|2
注意:此解决方案不上非常稀疏集表现良好......我在寻找一个替代的办法来处理稀疏套。
例如,在一组10000行中,val的值为[0,1],但所有值均为0.此代码需要大约2分30秒才能在我的硬件上运行。不是很好。