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