sql - 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 号站再次登记时的最后一次出院时间和第一次入院时间之间的差异。这应该算作一次重新入院。
我用LAG
and尝试了一些东西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 来做这件事。
提前致谢!
解决方案
您需要一个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 天。
这假设您将日期字符串设置为date
s。如果你有timestamp
s 而不是,你需要区间算术,所以:
where dt_from < lag_dt_to + interval '2' day
请注意case
,from
和to
是Oracle 中的保留词:我在查询中使用了替代名称。
推荐阅读
- java - 无法在java android中强制杀死冻结的线程
- asp.net - PROD 中的 asp.net 机密
- javascript - 是否可以从 javascript 动态创建 firebase 实时数据库并获取其 API 密钥?
- r - r - 编码两个变量以跨两个数据集创建唯一 ID
- taleo - Taleo Import - 无需对系统应用更改即可进行导入的方法
- mysql - 什么是复合索引以及如何正确使用它?
- node.js - 将 swagger codegen 集成到现有项目中
- java - 创建数据库和表,并在springboot中使用java将静态数据插入到表中
- python - Tensorflow 得到验证丢失问题
- c++ - 如何从 initializer_list 初始化二维数组