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 站再次登记时最后一次出院时间和第一次入院时间之间的差异。这应该算作一次再入院。
我已经用 LAG
和 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
是 reserverd words in Oracle:我在查询中使用了替代名称。
我有一个关于 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 站再次登记时最后一次出院时间和第一次入院时间之间的差异。这应该算作一次再入院。
我已经用 LAG
和 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
是 reserverd words in Oracle:我在查询中使用了替代名称。