Как я могу сравнить столбец A в одной строке с столбцом B в другой группе? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть таблица информации об оплате для акций, где соответствующие столбцы:

  • Идентификационный номер (pk)
  • Персональный номер (от ФК до таблицы людей)
  • Номер выпуска (от fk до таблицы выпусков акций)
  • Дата начала
  • Дата окончания

Так что, если у лица № 100 есть запасы в выпуске #25, и они получают платеж 01.01.2009, затем в таблице проверяются дата, выпуск и лицо, чтобы определить, куда отправить платеж.

Для одного человека и выпуска может бытьнесколько наборов платежной информации, если она меняется.Проблема заключается в том, что в некоторых случаях для человека № 100 в вопросе № 25 дата окончания одного диапазона совпадает с датой начала следующего диапазона, когда они должны быть последовательными.Например:

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 голосов
/ 29 апреля 2019

Если вы хотите выполнить общую проверку на совпадения, вы можете сделать:

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----
0 голосов
/ 29 апреля 2019

попробуйте этот запрос:

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

Таким образом, вы получите все записи о лицах, которые имеют ту же дату окончания, что и дата начала для различий.

0 голосов
/ 29 апреля 2019

ввод:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...