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
我有一个查询 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