以下查询查找所有后续区间:
select item1.name, item1.createdDate, item2.createdDate
from mytable item1
join mytable item2
on item1.name = item2.name and
not exists (
select 1
from mytable inneritem
where inneritem.name <> item1.name and
inneritem between item1.createdDate and item2.createdDate
);
但是,上面的查询将产生较长间隔的子集作为单独的集合,因此,为了限制上面查询的过于宽泛的结果,我们需要为每个可能的对检查以下内容:
- 他们的名字匹配
- 第一个早于第二个
- 第一个和第二个之间没有与其名称不匹配的项目
- 在第一个之前没有项目,匹配它的名称,但没有另一个名称不同的项目
- 第二个之后没有项目,匹配它的名称,但没有另一个名称不同的项目
解决方案
create table mytable(name varchar(32), createdDate varchar(64));
insert into mytable(name, createdDate) values
('John', '20160101 20:36:12'),
('Max', '20160101 20:36:12'),
('Max', '20160101 20:37:12'),
('Max', '20160101 20:38:12'),
('John', '20160101 20:38:12'),
('John', '20160101 20:39:12'),
('Max', '20160101 20:41:12');
select item1.name, item1.createdDate, item2.createdDate
from mytable item1
join mytable item2
on item1.name = item2.name and
item1.createdDate < item2.createdDate and
not exists (
select 1
from mytable inneritem
where inneritem.name <> item1.name and
inneritem.createdDate > item1.createdDate and
inneritem.createdDate < item2.createdDate
) and
not exists (
select 1
from mytable inneritem
where inneritem.name = item1.name and
inneritem.createdDate < item1.createdDate and
not exists (
select 1
from mytable innerinneritem
where innerinneritem.name <> item1.name and
innerinneritem.createdDate > inneritem.createdDate and
innerinneritem.createdDate < item1.createdDate
)
) and
not exists (
select 1
from mytable inneritem
where inneritem.name = item1.name and
inneritem.createdDate > item2.createdDate and
not exists (
select 1
from mytable innerinneritem
where innerinneritem.name <> item1.name and
innerinneritem.createdDate > item2.createdDate and
innerinneritem.createdDate < inneritem.createdDate
)
);
你可以测试的地方:http://sqlfiddle.com/#!18/7659f/7
注意
您有不同名称的重复日期,这可能会引起混淆。