我试着用重叠的句点对数据进行分组,如果完全覆盖一个较大的句点,则只保留较小的句点。
所以一个更清楚的例子。
假设这个结构和数据

drop table chload.testdata
create table chload.testdata
(
  id int,
  startdate date,
  enddate date,
  val text
);

insert into chload.testdata (id,startdate,enddate,val) values
-- included periods
(1, to_date('2009-01-01','YYYY-MM-DD'), to_date('2010-01-01','YYYY-MM-DD'), 'incA'),
(2, to_date('2010-01-01','YYYY-MM-DD'), to_date('2011-01-01','YYYY-MM-DD'), 'incB'),
(3, to_date('2011-01-01','YYYY-MM-DD'), to_date('2012-01-01','YYYY-MM-DD'), 'incC'),

-- isolated period
(4, to_date('2008-01-01','YYYY-MM-DD'), to_date('2009-01-01','YYYY-MM-DD'), 'isoD'),

-- Covering periods
(5, to_date('2009-01-01','YYYY-MM-DD'), to_date('2011-01-01','YYYY-MM-DD'), 'covE'),
(6, to_date('2009-01-01','YYYY-MM-DD'), to_date('2012-01-01','YYYY-MM-DD'), 'covF')
;

现在游戏就是要得到那个结果
2009-01-01  2010-01-01  incA covE covF
2010-01-01  2011-01-01  incB covE covF
2011-01-01  2012-01-01  incC covF
2008-01-01  2009-01-01  isoD

注:如果覆盖期间完全由包含期间“覆盖”,则不显示覆盖期间。
提前谢谢:)

最佳答案

试着用这个

SELECT distinct lg1.startdate, lg1.enddate, lg1.val || ' '|| lg2.val
  FROM testdata lg1,testdata lg2
where  lg1.enddate<= lg2.enddate and  lg1.startdate>= lg2.startdate and  lg1.id!= lg2.id
order by 3

关于sql - PostgreSQL组按句号重叠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45171547/

10-15 13:48