如何根据滚动的30天窗口SQL选择行



我的问题涉及如何识别指数放电。

指数流量是最早的流量。在那一天,30天的窗口期开始了。在此期间的任何入院都被视为再次入院,应予以忽略。一旦30天的窗口期结束,随后的任何出院都被视为一个指标,30天窗口期再次开始。

我似乎搞不出这其中的逻辑。我尝试过不同的窗口函数,我尝试过交叉连接和交叉应用。我一直遇到的问题是,重新入院不能成为指数入院。必须将其排除在外。

我已经成功地编写了一个while循环来解决这个问题,但如果可能的话,我真的很想用基于集合的格式来实现。到目前为止我还没有成功。

最终目标是这个-

出院日期医疗记录编号<1><1><1><1><1>
id 入院日期索引
1 2021-03-03 00:00:00.000 2022-03-09 13:20:00.000 X0090362
2021-03-05 00:00:00.000
2021-05-18 00:00:00.000 2021-05-21 22:20:00.000 X0012614 1
2021-06-21 00:00:00.000 2021-07-08 13:30:00.000 X0012614 1
2021-02-03 00:00:00.000
10 2021-03-23 00:00:00.000 2022-03-26 16:40:00.000 X0019655
11 2021-03-15 00:00:00.000 2022-03-18 15:53:00.000 X4135958
13 2021-05-17 00:00:00.000 2022-05-23 14:55:00.000 X4135958
15 2021-06-24 00:00:00.000 2021-07-13 15:06:00.000 X4135958

您可以使用递归CTE来标识与每个";索引";放电:

with a as (
select a.*, row_number() over (order by dischargedatetime) as seqnum
from admissions a
),
cte as (
select id, admitdate, dischargedatetime, unitnumber, seqnum, dischargedatetime as index_dischargedatetime
from a
where seqnum = 1
union all
select a.id, a.admitdate, a.dischargedatetime, a.unitnumber, a.seqnum,
(case when a.dischargedatetime > dateadd(day, 30, cte.index_dischargedatetime)
then a.dischargedatetime else cte.index_dischargedatetime
end) as index_dischargedatetime
from cte join
a
on a.seqnum = cte.seqnum + 1
)
select *
from cte;

然后,您可以将其合并到update:中

update admissions
set indexyn = (case when admissions.dischargedatetime = cte.index_dischargedatetime then 'Y' else 'N' end)
from cte
where cte.id = admissions.id;

这里有一个db<gt;不停摆弄注意,我将IndexYN的类型更改为分配'Y'/'N'的字符,考虑到列名,这是有意义的。

最新更新