如何在组内将一行中的A列与另一行中的B列进行比较?

时间:2019-04-29 13:33:19

标签: sql oracle

我有一张有关股票发行的付款信息表,其中相关列为:

  • ID号(pk)
  • 人员编号(从fk到人员表)
  • 问题编号(从fk到股票发行表)
  • 开始日期
  • 结束日期

因此,如果#100人的持有股份在#25中,并且他们在2019年1月1日获得付款,则将在表格中检查日期,发行人和人以确定付款的发送地点。

对于一个人和一个问题,如果更改,则可以有多组付款信息。问题在于,在某些情况下,对于问题#25下的#100人,当一个范围应该连续时,一个范围的结束日期与下一个范围的开始日期相同。例如:

Record 1: 01/01/2019 to 03/01/2019  
Record 2: 03/01/2019 to 06/01/2019  

代替

Record 1: 01/01/2019 to 02/28/2019  
Record 2: 03/01/2019 to 06/01/2019

我该如何搜索,并在每组人/问题对内检查开始日期和结束日期是否有重叠?我对普通SQL有一个很好的处理,但是对PL / SQL的掌握不够,在这种情况下,这似乎是必要的。由于这种情况特殊且难以描述,因此在Google上找到合适的帮助时遇到了一些麻烦。

3 个答案:

答案 0 :(得分:0)

输入:

insert into payment (id, startdate, enddate) values (1,'13/01/2019','20/01/2019');
insert into payment (id, startdate, enddate) values (2,'21/01/2019','30/01/2019');
insert into payment (id, startdate, enddate) values (3,'30/01/2019','02/02/2019');
insert into payment (id, startdate, enddate) values (4,'30/01/2019','02/02/2019');

太香草了吗?

select p1.id, p2.id
from payment p1
  inner join payment p2 on p2.id <> p1.id 
        and p2.startdate between  p1.startdate and p1.enddate

输出:

2   3
2   4
3   4
4   3

select p1.*
  from payment p1
 where exists (select 1 
                 from payment p2 
                where p2.id <> p1.id 
                  and  p2.startdate between p1.startdate and p1.enddate)

输出:

2
3
4

答案 1 :(得分:0)

如果要常规检查重叠部分,可以执行以下操作:

select p.*
from payments p
where exists (select 1
              from payments p2
              where p2.person_id = p.person_id and
                    p2.stock = p.stock and
                    p2.enddate >= p.startdate and
                    p2.startdate <= p.enddate
             )
order by p.person_id, p.stock, p.startdate;

这会发现所有重叠,包括嵌套的重叠:

---A-------B-----B------A----

答案 2 :(得分:0)

尝试此查询:

select * from payment p1 
where end_date in 
    (select p2.start_date 
        from payment p2 
        where p2.person_number = p1.person_number );

这样,您将获得所有差异记录的结束日期与开始日期相同的人记录。