SQL 显示日期范围内 30 天内最接近的可用日期

SQL show closest available date within 30 days from a range of dates

我有一个查询 return 某个特定患者的所有入院时间,并且对于每个患者的任何给定入院日期,我需要找到他们下一次入院的时间,如果这是在 30 天内previosu 入院,admimeth 在 20s 范围内,并且 return 迄今为止每个适用的入院记录。

示例:

对于这次入场,我希望看到日期 2020-08-06 20:14:00.000 在下面的记录 1 和 2 中重复出现,因为前面两个日期都在 30 天内并且 admimeth 的类型为 20s

在 table 中我们有这样的数据:

admission, admimeth, admidatetime
530439  12  2020-07-10 08:55:00.000
535686  12  2020-07-31 09:00:00.000
537265  21  2020-08-06 20:14:00.000

我的 SQL 目前生成这个:

admission, admimeth, admidatetime, nextadmdatetime
530439  12  2020-07-10 08:55:00.000 NULL
535686  12  2020-07-31 09:00:00.000 2020-08-06 20:14:00.000
537265  21  2020-08-06 20:14:00.000 NULL

数据应如下所示:

admission, admimeth, admidatetime, nextadmdatetime
530439  12  2020-07-10 08:55:00.000 2020-08-06 20:14:00.000
535686  12  2020-07-31 09:00:00.000 2020-08-06 20:14:00.000
537265  21  2020-08-06 20:14:00.000 NULL

到目前为止,我已经尝试过使用 row)number() 函数并执行 datediff,但这似乎不是正确的方法。这是我到目前为止尝试过的:

select
[inf].[tbl_ARK2].crn, [inf].[tbl_ARK2].admission, [inf].[tbl_ARK2].admimeth,
case when datediff(d,convert(date,[inf].[tbl_ARK2].disdatetime),convert(date,arkreadm.admidatetime)) <=30 and arkreadm.admimeth like '2%'  then '1' else '0' end [nextadm30],
case when datediff(d,convert(date,[inf].[tbl_ARK2].disdatetime),convert(date,arkreadm.admidatetime)) <=30 and arkreadm.admimeth like '2%'  then arkreadm.admidatetime else NULL end [nextadm30datetime]
from [inf].[tbl_ARK2] 
left join (select 
            crn,admission,[admimeth],admidatetime,disdatetime,
             ROW_NUMBER() over (PARTITION by crn order by convert(date,admidatetime)) [seq]
             from [inf].[tbl_ARK2]
             ) arkreadm
on [inf].[tbl_ARK2].crn = arkreadm.crn
and [inf].[tbl_ARK2].seq = arkreadm.seq-1

如有任何建议,我们将不胜感激。

使用 OUTER APPLY() 并将您的条件放在 apply 部分

select  *
from    yourtable t
        outer apply
        (
            select  x.admidatetime as nextadmdatetime
            from    yourtable x
            where   x.admimeth  like '2%'
            and     x.admidatetime  > t.admidatetime
            and     dateadd(day, 30, t.admidatetime) > x.admidatetime
        ) n