sql - 如何捕获分组中的第一行以及每行至少相隔 15 天的后续行?
问题描述
假设给定的保险只会为同一位患者在 15 天内访问同一位医生一次的费用支付费用。如果患者在这 15 天内去看医生一次、两次或二十次,医生将只获得一次付款。如果患者在第 16 天或第 18 天或第 29 天(或全部三个!)再次出现,医生将获得第二次付款。第一次访问(或 15 天间隔后的第一次访问)始终是必须计费的,连同其投诉。
所有访问的 SQL 可以粗略地表示如下:
SELECT VisitID
,PatientID
,VisitDtm
,DoctorID
,ComplaintCode
FROM Visits
目标是以仅捕获可计费事件的方式查询访问表。
我一直在尝试解决这个问题,该问题本质上与相隔不到 15 天并分配 min/max date 的 Group rows非常相似。但是,这对我不起作用的原因是,正如公认的回答者(Salman A)指出的那样,请注意,这可能会将更长的日期范围组合在一起,例如 01-01、01-11、01-21、02- 01 和 02-11 将组合在一起,尽管第一个日期和最后一个日期相隔超过 15 天。 这给我带来了一个问题,因为要求始终在第一个事件过去 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)
在查询的最后添加。
推荐阅读
- scala - 如何使用 java.lang.reflect.Type 在 Scala 中动态(运行时)生成排序集合?
- html - 在 Chrome Inspect 期间修复了 html 布局之外的页脚踢
- sql-server - 使用 SQL Server 在 AWS RDS 中的多个数据库之间共享资源
- go - Viper 自动环境不从环境中读取
- ios - Flutter 构建 Xcode:找不到模块“firebase_analytics”
- node.js - 当我使用 docker 和 node16 运行 npm run build 时出现警告
- python - 使用 seaborn kdeplot 返回错误
- azure - 使用 JSON 进行 ADF 解析转换
- r - 结合毫秒值和日期在 R 中创建 POSIX 友好格式
- wordpress - 所有 WordPress 多站点站点都将主站点的 URL 用于站点资产