2

电子病历 (EMR) 报告在确定活动以特定频率发生时的常见问题。在这种情况下,我需要确定入院后每 72 小时写一次便条。

鉴于:

A                                       D
|-0-|-1-|-2-|-3-|-4-|-5-|-6-|-7-|-8-|-9-|
|---- 1 ----|---- 2 ----|---- 3 ----|-4-|

在周期 1、2 和 3 中至少需要一个注释。因为 4 不是一个完整的 72 小时周期,所以它不需要注释。未能在周期 1、2 和 3 中找到注释将被视为失败。

数据:

(ENC):

ENC_ID  ADMITTED    DISCHARGED  PERIODS PASS_FAIL
4114221 06/15/09 18:30  06/24/09 15:40  3   ?

期间: TRUNC(CEIL((DISCHARGED - ADMITTED)/3))

“PASS_FAIL”列将指示遭遇是否有足够数量和时间的笔记。

(笔记):

ENC_ID  NOTE_ID NOTE_TIME   PERIOD
4114221 1833764 06/17/09 08:42  1
4114221 1843613 06/18/09 08:14  1
4114221 1858159 06/18/09 20:15  2
4114221 1850948 06/18/09 20:15  2
4114221 1850912 06/18/09 20:18  2
4114221 1859315 06/19/09 18:35  2
4114221 1863982 06/20/09 10:29  2
4114221 1868895 06/21/09 22:00  3
4114221 1873539 06/22/09 15:42  3

时期:CEIL((NOTE_TIME - ADMITTED)/3)

有没有解决这个问题的有效方法?

4

2 回答 2

0
SELECT  e.*,
        CASE WHEN cnt = TRUNC(CEIL((discharged / admitted) / 3)) THEN 'pass' ELSE 'fail' END AS pass_fail
FROM    (
        SELECT  COUNT(*) AS cnt
        FROM    enc ei
        CROSS JOIN
                (
                SELECT  level AS period
                FROM    dual
                CONNECT BY
                        level <= 
                        (
                        SELECT  TRUNC(CEIL((discharged / admitted) / 3))
                        FROM    enc
                        WHERE   enc_id = :enc_id
                        )
                ) p
        WHERE   ei.enc_id = :enc_id
                AND EXISTS
                (
                SELECT  NULL
                FROM    note
                WHERE   enc_id = ei.enc_id
                        AND note_time >= ei.admitted + (p - 1) * 3
                        AND note_time < ei.admitted + p * 3
                )
        ) c
JOIN    enc e
ON      e.enc_id = :enc_id
于 2012-04-24T18:32:41.800 回答
0

如果我正确地阅读了您的问题,NOTE那么是一个带有指示数据的表格。

您真正关心的是每个enc_id.

如果是这种情况,则表明应使用分析函数:

select e.enc_id, e.admitted, e.discharged, e.periods
     , decode( n.ct
             , 'pass'
             , 'fail' ) as pass_fail
  from enc e
  left outer join ( select distinct enc_id
                         , count(n.period) over ( partition by n.enc_id ) as ct
                      from note
                     where period in (1,2,3)
                           ) n
    on e.enc_id = n.enc_id

这将选择所有期间的 per enc_idfrom note,即您要检查的那些。然后计算它们每enc_id. enc_id独特之处在于确保您在最终结果中仅获得一行。

如果您只想要那些enc_id具有值的 s,note那么将左外连接变为内连接。

如果period不是,如所示,在note查询中,您必须对完整查询而不是子查询执行不同的操作,并检查period每个查询中的每个note_id

对于可怕的格式,我很抱歉,但我想尝试将它放在页面上。

select distinct e.enc_id, e.admitted, e.discharged, e.periods
     , decode( count( distinct -- number of distinct periods
                       case when n.note_time between e.admitted 
                                                 and e.admitted + 3 then 1
                            when n.note_time between e.admitted 
                                                 and e.admitted + 6 then 2
                            when n.note_time between e.admitted 
                                                 and e.admitted + 9 then 3
                            end ) -- per enc_id from note
                      over ( partition by n.enc_id )
              -- if it-s 3 then pass
             , 3, 'pass'
              -- else fail.
             , 'fail' ) as pass_fail
  from enc e
  left outer join note n
    on e.enc_id = n.enc_id

无论您的数据结构如何,这两种方式的好处是它们是简单的连接,一个索引唯一扫描(我假设enc.end_id是唯一的)和一个索引范围扫描( on note)。

于 2012-04-24T20:43:58.743 回答