首页 > 解决方案 > Oracle - 根据上一列和下一列计数

问题描述

关于使用 oracle 进行的一些数据库查询,我有一个相当不寻常的问题。

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

考虑以下示例:

案子 车站
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 号站再次登记时的最后一次出院时间和第一次入院时间之间的差异。这应该算作一次重新入院。

我用LAGand尝试了一些东西LEAD,但你不能在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 来做这件事。

提前致谢!

标签: sqloracledatetimesubquerywhere-clause

解决方案


您需要一个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

请注意casefromtoOracle 中的保留词:我在查询中使用了替代名称。


推荐阅读