2

SOで検索しましたが、直接的な答えが見つかりませんでした。

患者、病院、診療科(ER、泌尿器科、整形外科、内科など)、診療コード(検査、外科手術、MRI、超音波、その他)、患者の診察日があります。

患者は医者を訪ね、医者は薬を処方し、コントロールチェックのために再び来るように頼みます. 患者が10日後に戻ってきた場合、同じ病院に別の検査料を支払う必要があります. 病院は、検査料を受け取るために、次の 10 日間に利用可能なスロットがないことを告げて、10 日後に日付を指定する場合があります。

テーブル構造は次のようになります。

Patient id.no   Hospital    Medical Branch     Medical Op. Code      Date
  1                 H1             M0                P1            01/05/2011
  5                 H1             M1                P9            03/05/2011
  3                 H2             M0                P2            09/05/2011
  1                 H1             M0                P1            14/05/2011 
  3                 H1             M0                P2            20/05/2011
  5                 H1             M2                P9            25/05/2011
  1                 H1             M0                P3            26/05/2011

ここでは、訪問患者No. 3および5は、患者No.3 人は別の病院を訪れ、患者 5 は別の診療所を訪れます。10日以内に来院しても受験料はかかります。

ただし、患者番号 1 は、01/05 と 14/05 に同じ病院、同じ支店を訪れ、同じプロセス (P1: 検査) を受けます。

26/05は健康診断ではないので数えません。

私がフラグを立てたいのは、同じ患者、同じ病院、同じ支店、同じ診療コード (具体的には健康診断: P1 ) で、日付範囲が 10 日を超えていることです。

結果のテーブルの形式:

HOSPITAL        TOTAL NUM. of PATIENTS      NUM. of PATIENTS OUT OF DATE RANGE
  H1                        x                              a
  H2                        y                              b
  H3                        z                              c

ありがとう。

4

3 に答える 3

2

繰り返しますが、それは分析関数です。

このクエリは、LAG() 関数を使用して、YOUR_TABLE 内のレコードをテーブル内の前の (DATE で定義された) 一致するレコード (PATIENT_ID で定義) にリンクします。

select hospital_id
       , count(*) as total_num_of_patients      
       , sum (out_of_range) as num_of_patients_out_of_range
from (
    select patient_id
           , hospital_id
           , case
                   when hospital_id_1 = hospital_id_0
                   and  visit_1 > visit_0 + 10
                   and  med_op_code_1 = med_op_code_0
                   then 1
                   else 0
              end as out_of_range
    from (
            select patient_id
                   , hospital_id as hospital_id_1
                   , date as visit_1
                   , med_op_code as med_op_code_1
                   , lag (date) over (partition by patient_id order by date) as visit_0
                   , lag (hopital_id) over (partition by patient_id order by date) as hopital_id_0
                   , lag (med_op_code) over (partition by patient_id order by date) as med_op_code_0
            from your_table
            where med_op_code = 'P1'
        )
    )
group by hospital_id
/

警告: このコードはテストしていないため、構文エラーが含まれている可能性があります。次回 Oracle データベースにアクセスできるようになったときに確認します。

于 2011-08-24T21:13:18.657 に答える
1

Oracle DB を手元に持っていないので、これは少し大雑把ですが、重要な機能は同じで、分析関数 LAG() です。そのコンパニオン関数である LEAD() とともに、活動期間などに対処するのに役立ちます。

コードでの私の試みは次のとおりです。

select n.hospital, COUNT(n.patient_id) as patients_out_of_date_range
from (
    select *
    from (
        select d.*, lag(date, 1) over (partition by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code order by d.date) as prev_date
        from datatable d inner join
            (
                select d.patient_id, d.hospital, d.medical_branch, d.medical_op_code
                from datatable d
                where d.medical_op_code = 'P1'
                group by d.patient_id, d.hospital, d.medical_branch, d.medical_op_code
                having COUNT(d.date) > 1
            ) t on d.patient_id  = t.patient_id and d.hospital = t.hospital and d.medical_branch = t.medical_branch and d.medical_op_code = t.medical_op_code
        ) m
    where date - prev_date > 10
    ) n
group by n.hospital

私が言うように、これはテストされていませんが、少なくとも正しい方向に始めることができるはずです.

参考文献: http://www.adp-gmbh.ch/ora/sql/analytical/lag.html

http://www.oracle-base.com/articles/misc/LagLeadAnalyticFunctions.php

于 2011-08-24T21:38:26.623 に答える
1

私はこれがあなたがしようとしているものだと思います:

WITH Patient_Visits (Patient_Id, Hospital_Id, Branch_Id, Visit_Date, Visit_Order) as ( 
                     SELECT Patient_Id, Hospital_Id, BranchId, Visit_Date, 
                            ROW_NUMBER() OVER(PARTITION BY Patient_ID, Hospital_Id, Branch_Id, 
                                              ORDER_BY Patient_Id, Hospital_Id, Branch_Id, Visit_Date)
                    FROM Hospital_Visits
                    WHERE Procedure_Id = 'P1'),
     Hospital_Recent_Visits (Hospital_Id, Recent_Visitor_Count) as (
                             SELECT a.Hospital_Id, COUNT(DISTINCT a.Patient_Id)
                             FROM Patient_Visits as a
                             JOIN Patient_Visits as b
                               ON b.Hospital_Id = a.Hospital_Id
                                  AND b.Branch_Id = a.Branch_Id
                                  AND b.Patient_Id = a.Patient_Id
                                  AND b.Visit_Order = a.Visit_Order - 1
                                  AND b.Visit_Date + 10 > a.Visit_Date
                             GROUP BY a.Hospital_Id, a.Patient_Id),
     Hospital_Patient_Count (Hospital_Id, Patient_Count) as (
                             SELECT Hospital_Id, COUNT(DISTINCT Patient_Id)
                             FROM Hospital_Visits
                             GROUP BY Hospital_Id, Patient_Id)
SELECT a.Hospital_Id, b.Patient_Count, c.Recent_Visitor_Count
FROM Hospitals as a
LEFT JOIN Hospital_Patient_Count as b
ON b.Hospital_Id = a.Hospital_Id
LEFT JOIN Hospital_Recent_Visits as c
ON c.Hospital_id = a.Hospital_Id

これは、DB2 システムに対して作成およびテストされていることに注意してください。Oracle データベースには関連する機能があると思いますので、クエリは記述どおりに機能するはずです。ただし、DB2 には Oracle が持つ OLAP 機能の一部が欠けているようで (少なくとも私のバージョンでは)、CTE の一部をノックアウトするのに役立つ可能性があります。

于 2011-08-24T21:42:29.583 に答える