如何解决如何捕获分组中的第一行和相隔至少15天的后续行?
假定给定的保险仅在15天内为同一位患者就诊同一位医生支付一次费用。如果患者在那15天内到医生那里一次,两次或二十次,医生将只获得一笔付款。如果患者在第16天或第18天或第29天(或这三天!)再来一次,医生将获得第二笔付款。第一次访问(或15天间隔之后的第一次访问)总是必须付费的,同时还要投诉。
所有访问的SQL可以大致表示如下:
SELECT VisitID,PatientID,VisitDtm,DoctorID,ComplaintCode
FROM Visits
目标是以仅捕获可计费事件的方式查询Visits表。
我一直在尝试解决这个问题,该问题在本质上与Group rows with that are less than 15 days apart and assign min/max date非常相似。但是,这对我不起作用的原因是,正如公认的回答者(Salman A)所指出的,请注意,这可能会将更长的日期范围组合在一起,例如虽然开始日期和结束日期相隔15天以上,但将01-01、01-11、01-21、02-01和02-11分组在一起。 这对我来说是个问题,因为必须在第一次事件发生15天后始终捕获下一个事件。
我花了好几个小时仔细思考并仔细研究类似的问题,并且正在寻求帮助以了解解决方案的路径,而不一定是实际的代码解决方案。如果在代码解决方案的上下文中更容易回答,那很好。非常感谢任何指导!
解决方法
此类任务需要一个迭代过程,因此您可以跟踪上一次可计费的访问。一种方法是递归cte。
您通常会使用row_number()
来枚举每个患者的访问次数,然后从第一次访问开始遍历数据集,同时跟踪最后一次“可计费”访问。如果一次访问比上一次计费访问晚了15天,那么该值将重置。
with
data as (
select visitid,patientid,visitdtm,doctorid,row_number() over(partition by patientid order by visitdtm) rn
from visits
),cte as (
select d.*,visitdtm as billabledtm from data d where rn = 1
union all
select d.*,case when d.visitdtm >= dateadd(day,15,c.billabledtm)
then d.visitdtm
else c.billabledtm
end
from cte c
inner join data d
on d.patientid = c.patientid and d.rn = c.rn + 1
)
select * from cte where visitdtm = billabledtm order by patientid,rn
如果患者的拜访次数可能超过100次,则需要在查询的最后添加option (maxrecursion 0)
。
这是另一种方法。与GMB相似,这会在CTE中的Visits表中添加row_number,但还会在VisitDtm之间添加提前日期差。然后,它将日期差的累积“总和”除以15。当该商增加一个完整的整数时,它表示数据中的一个可计费事件。
类似这样的东西
;with lead_cte as (
select v.*,row_number() over (partition by PatientId order by VisitDtm) rn,datediff(d,VisitDtm,lead(VisitDtm) over (partition by PatientId order by VisitDtm)) lead_dt_diff
from Visits v),cum_sum_cte as (
select lc.*,sum(lead_dt_diff) over (partition by PatientId order by VisitDtm)/15 cum_dt_diff
from lead_cte),min_billable_cte as (
select PatientId,cum_dt_diff,min(rn) min_rn
from cum_sum_cte
group by PatientId,cum_dt_diff)
select lc.*
from lead_cte lc
join min_billable_cte mbc on lc.PatintId=mbc.PatientId
and lc.rn=mbc.min_rn;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。