我有一张有关股票发行的付款信息表,其中相关列为:
因此,如果#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上找到合适的帮助时遇到了一些麻烦。
答案 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 );
这样,您将获得所有差异记录的结束日期与开始日期相同的人记录。