Oracle - 基于上一列和下一列的计数

Oracle - Count based on previous and next column

我有一个关于 oracle 的一些数据库查询的非常不寻常的问题。

我被问到是否有可能获得患者在 48 / 72 小时内在同一站恢复出院的病例数。

考虑以下示例:

Case Station From To
1 Stat_1 2020-01-03 20:10:00 2020-01-04 17:40:00
1 Stat_2 2020-01-04 17:40:00 2020-01-05 09:35:00
1 Stat_1 2020-01-05 09:35:00 2020-01-10 12:33:00

在这个例子中,我必须检查他在第 1 站再次登记时最后一次出院时间和第一次入院时间之间的差异。这应该算作一次再入院。

我已经用 LAGLEAD 尝试了一些东西,但是你不能在 WHERE-Clause 中使用它们,所以我猜这不是很有用。

LAG (o.OEBENEID, 1, 0) OVER (ORDER BY vfs.GUELTIG_BIS) AS Prev_Stat,
LEAD  (o.OEBENEID, 1, 0) OVER (ORDER BY vfs.GUELTIG_BIS) AS Next_Stat,
LAG (vfs.GUELTIG_BIS, 1) OVER (ORDER BY vfs.GUELTIG_BIS) AS End_Prev_Stat,
LEAD (vfs.GUELTIG_AB, 1) OVER (ORDER BY vfs.GUELTIG_AB) AS Begin_Next_Stat

我可以得到旧值,但我不能做一些事情,比如计算这两个日期之间的差异。

这有可能实现吗?我真的不知道如何使用 SQL。

提前致谢!

您需要一个partition by子句来检索同一用户在同一站的上一次出院日期。然后,您可以在外部查询中进行过滤:

select count(*) as cnt
from (
    select case_no, station, dt_from, dt_to
        lag(dt_to) over(partition by case_no, station order by dt_from) as lag_dt_to
    from mytable t
) t
where dt_from < lag_dt_to + 2

这里统计的是同站同用户上一次出院日期间隔小于2天的行数

这假设您将日期串成 dates。如果你有 timestamps,你需要区间运算,所以:

where dt_from < lag_dt_to + interval '2' day

请注意 casefromtoreserverd words in Oracle:我在查询中使用了替代名称。