SQL находит дубликаты активных записей между двумя диапазонами дат - PullRequest
0 голосов
/ 27 июня 2019

У меня есть две таблицы: таблица пациентов и таблица страхования.Один пациент может иметь несколько страховок.Я пытаюсь найти все страховки, у которых есть перекрывающиеся активные даты или которые показывают две как активные.

PATID    START_DTTM           END_DTTM
1        2002-09-10 00:00:00.000  NULL
1        2007-03-06 10:18:00.000  2019-04-11 11:59:00.000

Если END_DTTM имеет значение Null, тогда оно активно.Дата начала должна начинаться, когда заканчивается следующая дата окончания.Я пытаюсь найти все записи, в которых активные даты перекрываются или которые показывают две активные записи за период, если это имеет смысл?

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

Любая помощь будет великолепна

Ответы [ 2 ]

1 голос
/ 27 июня 2019

В этом списке перечислены все страховки, у которых есть хотя бы одно перекрытие страховки.

select ID, PATID, START_DTTM, END_DTTM
from insurances i1
where exists (select null 
              from insurances i2
              where i1.ID != i2.ID and i1.PATID = i2.PATID
                and (i1.START_DTTM  <= i2.END_DTTM or i2.END_DTTM is null)
                and (i2.START_DTTM  <= i1.END_DTTM or i1.END_DTTM is null)
             )
order by PATID, START_DTTM;

Две активные страховки (нулевая дата окончания) считаются перекрывающимися.Вы можете изменить <= на <, если одинаковые даты начала / окончания не считаются перекрывающимися.

0 голосов
/ 27 июня 2019

Если у вашей страховой таблицы также есть уникальный идентификатор для каждой страховки (мы надеемся, что так), то у вас может быть запрос, подобный этому

declare @tab table (
    patid int
    , insid int
    , start_dttm datetime
    , end_dttm datetime
)

insert into @tab values (1, 8, '2002-09-10', NULL)
                        , (1, 9, '2007-03-06', '2019-04-11')
                        , (53, 321513, '2015-01-13', NULL )
                        , (53, 11, '2008-08-14', '2015-01-13')
                        , (54, 12, '2015-01-13', NULL )
                        , (54, 13, '2008-08-14', '2015-01-12')

select      a.*
            , b.*
            , 'Insurance record ' + cast(b.insid as varchar) + ' (' + convert(varchar,b.start_dttm,103) + ' to ' + convert(varchar,b.end_dttm,103) + ') '
             + 'overlaps Insurance record ' + cast(a.insid as varchar) + ' (' + convert(varchar,a.start_dttm,103) + isnull(' to ' + convert(varchar,a.end_dttm,103), ' still active') + ')'

from        @tab a
inner join  @tab b
on          a.patid = b.patid
and         a.insid != b.insid
where       (b.start_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or          (b.end_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or          (a.end_dttm is null and b.end_dttm is null)

Примечание. Вам не нужно создавать переменную таблицы @tab, как я это сделал, просто используйте свою таблицу страхования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...