Диапазон непрерывных дат SQL Ранее сгруппированные данные - PullRequest
0 голосов
/ 15 ноября 2018

Я работаю с экстрактом данных, который представляет данные о претензиях для населения.Конечная цель состоит в том, чтобы иметь возможность связывать конкретные претензии с уникальными встречами.То, как мы определяем столкновение, представляет собой цепочку утверждений, которые являются непрерывными или находятся в том же диапазоне;это означает, что претензия до даты сопровождается датой претензии сразу после или имеет дату, идентичную другой претензии.Однако, поскольку нет ключа, который фактически указывает на то, что группа утверждений представляет конкретную встречу, мы должны реализовать логику, которая делает это для нас.

Ради этого примера мы уже сгруппировали данные по Patient & Facility.

CREATE TABLE #BillingData (
ClaimID VARCHAR(MAX)
,Patient VARCHAR(MAX)
,Facility VARCHAR(MAX)
,ClaimFromDate DATE
,ClaimToDate DATE
,GroupID VARCHAR(MAX)
)

INSERT INTO #BillingData
VALUES
('Claim1','JOHN DOE','NURSING HOME','2000-01-01','2000-01-01','1')
,('Claim2','JOHN DOE','NURSING HOME','2000-01-01','2000-01-31','1')
,('Claim3','JOHN DOE','NURSING HOME','2000-01-01','2000-01-31','1')
,('Claim4','JOHN DOE','NURSING HOME','2000-01-01','2000-01-31','1')
,('Claim5','JOHN DOE','NURSING HOME','2000-02-01','2000-02-29','1')
,('Claim6','JOHN DOE','NURSING HOME','2000-03-01','2000-03-31','1')
,('Claim7','JOHN DOE','NURSING HOME','2000-04-01','2000-04-30','1')
,('Claim8','JOHN DOE','NURSING HOME','2000-08-01','2000-08-31','1')
,('Claim9','JOHN DOE','NURSING HOME','2000-09-01','2000-09-30','1')
,('Claim10','JANE DOE','HOME HEALTH','2000-02-01','2000-02-29','2')
,('Claim11','JANE DOE','HOME HEALTH','2000-03-01','2000-03-31','2')
,('Claim11','JANE DOE','HOME HEALTH','2000-03-01','2000-03-31','2')

В конечном итоге я хотел бы увидеть идентификатор встречи.Вот как отдельные претензии должны быть помещены в идентификаторы столкновений:

Претензии 1,2,3,4,5,6,7 указаны в Encounter 1.1;Претензии 8,9 относятся к Встрече 1.2;Претензии 10,11 в Encounter 2.1

Любые рекомендации будут с благодарностью!

1 Ответ

0 голосов
/ 15 ноября 2018

Вам нужно найти пропуски, то есть текущая дата начала больше, чем любая предыдущая дата окончания (плюс один день)

with gaps as
 (
   select *,
      case
        when max(ClaimToDate) -- max previous end date
             over (partition by Patient, Facility
                   order by ClaimFromDate, ClaimID
                   rows between unbounded preceding and 1 preceding)
            < dateadd(day,-1,ClaimFromDate) -- compare to current start date 
        then 1 -- gap
        else 0 -- overlapping ranges
      end as flag
   from #BillingData
 )
select *,
   sum(flag) -- cumulative sum over 0/1 to create encounter number 
   over (partition by Patient, Facility
         order by ClaimFromDate, ClaimID
         rows unbounded preceding) +1 as encounter
from gaps
order by GroupID, encounter, ClaimFromDate

См. скрипка

...