珠海网站设计价格,wordpress 博客主题,网站 备案 时间,网站建设和维护试卷需求描述#xff1a;在Oracle中 住院记录记录表为v_hospitalRecords#xff0c;表中FIHDATE入院时间#xff0c;FBIHID是住院号#xff0c; 我想查询出每个患者在他们的所有住院记录中是否在一个月内再次入院(相邻的两条记录进行比较)#xff0c;并且住院记录大于一的患者… 需求描述在Oracle中 住院记录记录表为v_hospitalRecords表中FIHDATE入院时间FBIHID是住院号 我想查询出每个患者在他们的所有住院记录中是否在一个月内再次入院(相邻的两条记录进行比较)并且住院记录大于一的患者在此入院的数据 1、方法一
1.1 如下图所示假如住院号为155131的患者入院记录有三条该病人第一次入院为2023-05-19 15:19:00、第二次为2023-06-13 15:19:00、第三次为2023-07-16 15:19:00那么我们排序下计算相邻两个是否在31天内并且显示这两条记录sql如下
SELECT FBIHID, FIHDATE,prev_fihdate,next_fihdate
FROM (SELECT FBIHID, FIHDATE,LAG(FIHDATE) OVER (PARTITION BY FBIHID ORDER BY FIHDATE ASC) AS prev_fihdate,LEAD(FIHDATE) OVER (PARTITION BY FBIHID ORDER BY FIHDATE ASC) AS next_fihdate,COUNT(*) OVER (PARTITION BY FBIHID) AS admissions_countFROM v_jc_mae_zy
)
WHERE (FIHDATE - prev_fihdate 31 OR next_fihdate - FIHDATE 31)
AND admissions_count 1;我们解释下这段sql这段sql是查找在 31 天内住院两次或以上的患者。查询从名为 v_jc_mae_zy 的视图中选择了四个列FBIHID、FIHDATE、prev_fihdate 和 next_fihdate。其中FBIHID 表示患者的 IDFIHDATE 表示患者住院的日期prev_fihdate 表示患者上一次住院日期next_fihdate 表示患者下一次住院日期。
为了计算 prev_fihdate 和 next_fihdate该查询使用了 LAG 和 LEAD 窗口函数。LAG 函数用于返回在当前行之前的行中指定列的值而 LEAD 函数用于返回在当前行之后的行中指定列的值。这里根据 FBIHID 分组按 FIHDATE 升序排序以得到每个患者的住院日期的前一次和下一次住院日期。
接下来该查询使用 COUNT 窗口函数计算了每个患者的住院次数将其命名为 admissions_count。
最后该查询使用条件筛选语句 WHERE选择了满足以下条件的行
当前住院日期与上一次住院日期之差小于等于 31 天或者当前住院日期与下一次住院日期之差小于等于 31 天。患者的住院次数大于 1。
如图所示 2、方法二
2.1我们如1.1所说一致采用另外一种方法sql如下
SELECT fbihid,fihdate, 上一个入院日期, 一个月后日期FROM (SELECT v.*,LAG(FIHDATE) OVER(PARTITION BY FBIHID ORDER BY FIHDATE) AS 上一个入院日期,LAG(FIHDATE) OVER(PARTITION BY FBIHID ORDER BY FIHDATE) INTERVAL 31 DAY AS 一个月后日期,COUNT(*) OVER(PARTITION BY FBIHID) AS 住院次数FROM v_jc_mae_zy v) aWHERE 住院次数 1AND (一个月后日期 fihdate or (上一个入院日期 is null or 一个月后日期 is null));我们解释下这段sql这段sql用于查找在 31 天内住院两次或以上的患者。查询从名为 v_jc_mae_zy 的视图中选择了四个列fbihid、fihdate、上一个入院日期 和 一个月后日期。其中fbihid 表示患者的 IDfihdate 表示患者住院的日期上一个入院日期 表示患者上一次住院日期一个月后日期 表示患者上一次住院日期的一个月后的日期。
为了计算 上一个入院日期 和 一个月后日期该查询使用了 LAG 窗口函数和日期函数 INTERVAL。LAG 函数用于返回在当前行之前的行中指定列的值。这里根据 fbihid 分组按 fihdate 升序排序以得到每个患者的住院日期的前一次入院日期。INTERVAL 31 DAY 表示一个月的时间间隔。因此LAG(FIHDATE) OVER(PARTITION BY FBIHID ORDER BY FIHDATE) INTERVAL 31 DAY 表示上一次住院日期的一个月后的日期。
接下来该查询使用 COUNT 窗口函数计算了每个患者的住院次数将其命名为 住院次数。
最后该查询使用条件筛选语句 WHERE选择了满足以下条件的行
患者的住院次数大于 1。上一次住院日期的一个月后的日期大于当前的住院日期或者上一次住院日期或一个月后的日期为空。
总之这个查询的目的是返回那些住院次数大于 1且上一次住院日期的一个月后的日期大于当前的住院日期或者上一次住院日期或一个月后的日期为空的患者的 ID、住院日期、上一次住院日期和上一次住院日期的一个月后的日期。
方法有很多种本次遇到了该问题所以记录一下如有错误还请指正