sql:有没有一种方法可以捕获“每45天一次”?

mnowg1ta  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(294)

第一次发帖,但多年来我偶然发现了stackoverflow。
一个病人可能会在几个月内多次接受特定的实验室检查。但是,为了减少重复,我只想每45天捕获一次这些结果。所以如果一个病人今天做了化验,我可以忽略接下来45天的化验。但是如果一个病人在第51天进行了重复的实验室测试,我想重新设置“时钟”,忽略接下来45天的实验室测试。
下面是我想做的:

PatientID    Date    DayNum    KeepThis?    DaysSinceLastKeptTest
    1      3/2/2020     0        Yes                 0
    1      3/5/2020     3                            3
    1      4/6/2020    35                           35
    1      4/10/2020   39                           39
    1      5/15/2020   74        Yes                 0 (more than 45 days since 3/2 test)
    1      5/25/2020   84                           10
    1      5/30/2020   89                           15
    1      6/6/2020    96                           22
    1      7/1/2020   121        Yes                 0 (more than 45 days since 5/15 test)
    1      7/4/2020   124                            3
    1      7/15/2020  135                           14

(在我的最终产品中,我不一定需要daynum、keepthis或dayssincelastkepttest列。我只需要3行“是”。)
我试着用sql来做这个,但是搞不懂。我已经考虑过临时表或子查询,我只是在学习over/partitionby作为一种可能的解决方法。
我很感激你的帮助和建议。谢谢!

11dmarpk

11dmarpk1#

使用递归cte,您可以:

with cte_rn
as
(
    select *,ROW_NUMBER() over (partition by patientId order by testdate ) as seq
    from patients
),
cte_recursive
as
(
    select *,cte_rn.testdate as usedTestDate,1 as toUse
    from cte_rn
    where seq=1
    union all
    select rn.patientid,rn.testdate,rn.seq,case when datediff(day ,r.usedTestDate,rn.testdate)>45 then rn.testdate else  r.usedTestDate end  as usedTestDate,case when datediff(day ,r.usedTestDate,rn.testdate)>45 then 1 else 0 end as toUse
    from cte_recursive r
    join cte_rn rn
        on r.seq = rn.seq-1

)

select *
from cte_recursive

相关问题