SQL 以前分组数据的连续日期范围

SQL Continuous Date Ranges Previously Grouped Data

我正在处理代表人口索赔数据的数据提取。最终目标是能够将特定的声明与独特的遭遇联系起来。我们定义遭遇的方式是一连串连续的或在同一范围内的声明;表示索赔截止日期紧随其后的索赔起始日期,或者与另一索赔具有相同的日期和起始日期。然而,因为没有键可以实际指示一组声明代表特定的遭遇,我们必须实现为我们做这件事的逻辑。

为了这个例子,我们已经按患者和设施对数据进行了分组。

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')

我最终希望看到的是遭遇 ID。这是将个人声明放入遭遇 ID 的方式:

声明 1,2,3,4,5,6,7 在 Encounter 1.1 中; 索赔 8,9 在遭遇 1.2 中; 声明 10,11 在 Encounter 2.1

任何指导将不胜感激!

您需要找到差距,即当前开始日期大于任何先前的结束日期(加一天)

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

fiddle