2

活動が特定の頻度で発生することを決定する際の電子医療記録 (EMR) レポートの一般的な問題。この状況では、入院後 72 時間ごとにメモが書かれたことを確認する必要があります。

与えられた:

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

期間 1、2、および 3 の間に少なくとも 1 つのメモが必要です。4 は完全な 72 時間の期間ではないため、メモは必要ありません。ピリオド 1、2、および 3 でノートが見つからない場合は FAIL となります。

データ:

(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、示されているデータを含む表があります。

本当に気にするのは、期間 1、2、および 3 がそれぞれのメモ テーブルに存在するかどうかだけです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

これにより、調べたい期間ごとenc_idに からすべての期間が選択されます。note次に、 ごとにカウントしますenc_idenc_id明確なのは、最終結果で1 行につき 1 行しか得られないようにするためです。

enc_id値が in ののみが必要な場合は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

データ構造がどうであれ、両方の方法の利点は、それらが単純な結合であり、1 つのインデックス ユニーク スキャン (enc.end_idが unique であると想定しています) と 1 つのインデックス レンジ スキャン ( on note) であることです。

于 2012-04-24T20:43:58.743 に答える